makedir.c
上传用户:jlteech
上传日期:2007-01-06
资源大小:349k
文件大小:7k
源码类别:

压缩解压

开发平台:

Visual C++

  1. /*
  2.  Copyright (C) 1996 Mike White
  3.  Permission is granted to any individual or institution to use, copy, or
  4.  redistribute this software so long as all of the original files are included,
  5.  that it is not sold for profit, and that this copyright notice is retained.
  6. */
  7. #include <windows.h>
  8. #include <ctype.h>
  9. #include <dos.h>
  10. #ifndef WIN32
  11. #   ifndef __BORLANDC__
  12. #      include <direct.h>
  13. #   else
  14. #      include <dir.h>
  15. #   endif /* !__BORLANDC__ */
  16. #else
  17. #   ifndef __BORLANDC__
  18. #      include <direct.h>
  19. #   else
  20. #      include <dir.h>
  21. #   endif /* !__BORLANDC__ */
  22. #endif /* !WIN32 */
  23. #include <stdio.h>
  24. #include <string.h>
  25. #include "wiz.h"
  26. #include "helpids.h"
  27. #ifndef TRUE
  28. #define TRUE 1
  29. #endif
  30. #ifndef FALSE
  31. #define FALSE 0
  32. #endif
  33. #ifndef PATH_MAX
  34. #define PATH_MAX 256
  35. #endif
  36. /*
  37.  * Function: BOOL MakeDirectory(char *path, BOOL fileAttached)
  38.  *
  39.  * Return:   TRUE if successful
  40.  *           FALSE if unsuccessful
  41.  *
  42.  * Creates directories specified by path. These can be any level of
  43.  * previously non-existent directories, up to PATH_MAX.
  44.  *
  45.  * First checks to see if a drive is designated, and if so, if the
  46.  * drive exists. If drive doesn't exist, returns FALSE.
  47.  *
  48.  * Then successively creates the directories (assuming they don't exist).
  49.  *
  50.  * Placed in the public domain by Mike White, 1995
  51.  *
  52.  */
  53. BOOL MakeDirectory(char *path, BOOL fileAttached);
  54. BOOL MakeDirectory(char *path, BOOL fileAttached)
  55. {
  56. char tempPath[PATH_MAX], tempChar;
  57. BOOL slash = FALSE;
  58. #ifdef WIN32
  59. DWORD attrib;
  60. unsigned int dReturn;
  61. #else
  62. unsigned int attrib;
  63. WORD dReturn;
  64. #endif
  65. int i;
  66. if (path[0] == '')
  67.    return TRUE; /* Don't need to make a directory */
  68. lstrcpy(tempPath, path);
  69. if (tempPath[1] == ':') /* check if drive included */
  70.     {
  71.     if (lstrlen(tempPath) < 4)
  72.         return TRUE; /* specified only a drive and a root directory */
  73. #ifndef WIN32
  74.     dReturn = GetDriveType(toupper(tempPath[0]) - 'A');
  75. #else
  76.     tempPath[2] = '\';
  77.     tempPath[3] = '';
  78.     dReturn = GetDriveType(tempPath);
  79.     lstrcpy(tempPath, path);
  80. #endif
  81.     if (dReturn == 0) /* drive type can't be determined */
  82.         return FALSE;
  83. #ifdef WIN32
  84.     if (dReturn == 1) /* root directory doesn't exist */
  85.         return FALSE;
  86. #endif
  87.     }
  88. /* Is this a valid path already? If so, return TRUE */
  89. /* There appears to be a bug (feature?) in NT 3.51 (and perhaps other
  90.    versions as well) that allows you to create a path the first time for a
  91.    given application, but erroneously reports that the path exists, if
  92.    another application deletes the directories, hence the following code
  93.    has been commented out until such time as a fix is figured out.
  94. #ifndef WIN32
  95. _dos_getfileattr(tempPath, &attrib);
  96. if (attrib & _A_SUBDIR)
  97.    {
  98.    return TRUE;
  99.    }
  100. #else
  101. attrib = GetFileAttributes(tempPath);
  102. if (attrib & FILE_ATTRIBUTE_DIRECTORY)
  103.    {
  104.    return TRUE;
  105.    }
  106. #endif
  107. */
  108. if (tempPath[1] == ':')
  109.    for (i = 3; i < lstrlen(path); i++)
  110.       {
  111.       if (tempPath[i] == '\')
  112.          {
  113.          tempChar = tempPath[i];
  114.          tempPath[i] = '';
  115.          mkdir(tempPath); /* We don't care what the return value is, if it
  116.                              already exists, we'll get an error. Check later
  117.                              on.
  118.                           */
  119.          tempPath[i] = tempChar;
  120.          slash = TRUE;
  121.          }
  122.       }
  123. else
  124.    for (i = 1; i < lstrlen(path); i++)
  125.       {
  126.       if (tempPath[i] == '\')
  127.          {
  128.          tempChar = tempPath[i];
  129.          tempPath[i] = '';
  130.          mkdir(tempPath); /* We don't care what the return value is, if it
  131.                              already exists, we'll get an error. Check later
  132.                              on.
  133.                           */
  134.          tempPath[i] = tempChar;
  135.          slash = TRUE;
  136.          }
  137.       }
  138. if (slash && !fileAttached)
  139.     mkdir(tempPath);
  140. else
  141.     if (!fileAttached)
  142.        mkdir(tempPath);
  143. if (fileAttached)
  144.    {
  145.    char *ptr;
  146.    if ((ptr = strrchr(tempPath, '\')) != NULL)
  147.       *ptr = '';
  148.    }
  149. /* Now, do we have a valid path? */
  150. #ifndef WIN32
  151. _dos_getfileattr(tempPath, &attrib);
  152. if (attrib & _A_SUBDIR)
  153.    return TRUE;
  154. #else
  155. attrib = GetFileAttributes(tempPath);
  156. if (attrib & FILE_ATTRIBUTE_DIRECTORY)
  157.    return TRUE;
  158. #endif
  159. /* Still no valid path, can't create it. return false */
  160. return FALSE;
  161. }
  162. /****************************************************************************
  163.     FUNCTION: MakeDirProc(HWND, unsigned, WPARAM, LPARAM)
  164.     PURPOSE:  Processes messages for "Make Directory" dialog box
  165.     MESSAGES:
  166.     WM_INITDIALOG - initialize dialog box
  167.     WM_COMMAND    - Input received
  168. ****************************************************************************/
  169. #ifdef __BORLANDC__
  170. #pragma warn -par
  171. #endif
  172. BOOL WINAPI
  173. MakeDirProc(HWND hDlg, WORD wMessage, WPARAM wParam, LPARAM lParam)
  174. {
  175. static HWND hSelect, hMakeDir;
  176. char tempPath[128];
  177. int nPatternLength;   /* length of data in pattern edit window */
  178.    switch (wMessage) {
  179.    case WM_INITDIALOG:
  180.       hSelect = GetDlgItem(hDlg, IDOK);
  181.       hMakeDir = GetDlgItem(hDlg, IDM_MAKEDIR_PATH);
  182.       SetDlgItemText(hDlg, IDM_CURRENT_PATH,szUnzipToDirName);
  183.       CenterDialog(GetParent(hDlg), hDlg);
  184.       return TRUE;
  185.    case WM_COMMAND:
  186.       switch (LOWORD(wParam))
  187.         {
  188.         case IDM_MAKEDIR_PATH:
  189.             if (GET_WM_COMMAND_CMD(wParam, lParam) == EN_CHANGE)
  190.                {
  191.                if ((nPatternLength = GetWindowTextLength(hMakeDir))==1)
  192.                   {
  193.          /* Enable or disable buttons depending on fullness of
  194.           * "Suffix" box.
  195.           */
  196.                   BOOL fButtonState = TRUE ;
  197.                   WinAssert(hSelect);
  198.                   EnableWindow(hSelect, fButtonState);
  199.                   }
  200.                if (nPatternLength == 0)
  201.                   {
  202.                   BOOL fButtonState = FALSE;
  203.                   WinAssert(hSelect);
  204.                   EnableWindow(hSelect, fButtonState);
  205.                   }
  206.                }
  207.             break;
  208.       case IDOK: /* Make Directory */
  209.          GetDlgItemText(hDlg, IDM_MAKEDIR_PATH, tempPath, PATH_MAX);
  210.          if (tempPath[lstrlen(tempPath) - 1] == '\')
  211.             tempPath[lstrlen(tempPath) - 1] = ''; /* strip trailing backslash */
  212.          if (strchr(tempPath, '\') == NULL)
  213.             {
  214.             char sz[PATH_MAX];
  215.             lstrcpy(sz, szUnzipToDirName);
  216.             strcat(sz, "\");
  217.             strcat(sz, tempPath);
  218.             lstrcpy(tempPath, sz);
  219.             }
  220.          if (!MakeDirectory(tempPath, FALSE))
  221.             {
  222.             char tStr[PATH_MAX];
  223.             sprintf(tStr, "Could not create %s", tempPath);
  224.             MessageBox(hDlg, tStr, NULL, MB_OK | MB_ICONSTOP);
  225.             }
  226.          else
  227.             {
  228.             char tStr[PATH_MAX];
  229.             sprintf(tStr, "Created directory: %sn", tempPath);
  230.             BufferOut(tStr);
  231.             }
  232.          EndDialog(hDlg, wParam);
  233.          break;
  234.       case IDCANCEL:
  235.          EndDialog(hDlg, wParam);
  236.          break;
  237.       case IDM_MAKEDIR_HELP:
  238.             WinHelp(hDlg,szHelpFileName,HELP_CONTEXT, (DWORD)(HELPID_MAKEDIR_HELP));
  239.       }
  240.       return TRUE;
  241.    case WM_CLOSE:
  242.       DestroyWindow(hDlg);
  243.       return TRUE;
  244.    }
  245.    return FALSE;
  246. }
  247. #ifdef __BORLANDC__
  248. #pragma warn .par
  249. #endif