wcmd: mkdir recursive create

Aric Stewart aric at codeweavers.com
Fri Dec 2 11:51:39 CST 2005


in at least both win2k and winxp mkdir from the command prompt can 
recursively create full directory paths. This implements that 
functionality. Code basically the same as in setupapi which if i recall 
correctly is Alexandre Julliards work.
-------------- next part --------------
Index: programs/wcmd/builtins.c
===================================================================
RCS file: /home/wine/wine/programs/wcmd/builtins.c,v
retrieving revision 1.32
diff -u -r1.32 builtins.c
--- programs/wcmd/builtins.c	2 Dec 2005 10:30:04 -0000	1.32
+++ programs/wcmd/builtins.c	2 Dec 2005 17:45:42 -0000
@@ -150,11 +150,58 @@
  * WCMD_create_dir
  *
  * Create a directory.
+ *
+ * this works recursivly. so mkdir dir1\dir2\dir3 will create dir1 and dir2 if
+ * they do not already exist.
  */
 
+BOOL create_full_path(CHAR* path)
+{
+    int len;
+    CHAR *new_path;
+    BOOL ret = TRUE;
+
+    new_path = HeapAlloc(GetProcessHeap(),0,strlen(path)+1);
+    strcpy(new_path,path);
+
+    while ((len = strlen(new_path)) && new_path[len - 1] == '\\')
+        new_path[len - 1] = 0;
+
+    while (!CreateDirectory(new_path,NULL))
+    {
+        CHAR *slash;
+        DWORD last_error = GetLastError();
+        if (last_error == ERROR_ALREADY_EXISTS)
+            break;
+
+        if (last_error != ERROR_PATH_NOT_FOUND)
+        {
+            ret = FALSE;
+            break;
+        }
+
+        if (!(slash = strrchr(new_path,'\\')) && ! (slash = strrchr(new_path,'/')))
+        {
+            ret = FALSE;
+            break;
+        }
+
+        len = slash - new_path;
+        new_path[len] = 0;
+        if (!create_full_path(new_path))
+        {
+            ret = FALSE;
+            break;
+        }
+        new_path[len] = '\\';
+    }
+    HeapFree(GetProcessHeap(),0,new_path);
+    return ret;
+}
+
 void WCMD_create_dir (void) {
 
-  if (!CreateDirectory (param1, NULL)) WCMD_print_error ();
+    if (!create_full_path(param1)) WCMD_print_error ();
 }
 
 /****************************************************************************


More information about the wine-patches mailing list