add MakeSureDirectoryPathExistsExA/W
Added: trunk/reactos/include/rosrtl/path.h
Added: trunk/reactos/lib/rosrtl/file/path.c
Modified: trunk/reactos/lib/rosrtl/makefile

Added: trunk/reactos/include/rosrtl/path.h
--- trunk/reactos/include/rosrtl/path.h	2005-01-12 06:02:58 UTC (rev 12944)
+++ trunk/reactos/include/rosrtl/path.h	2005-01-12 07:51:11 UTC (rev 12945)
@@ -0,0 +1,21 @@
+/*
+ */
+
+#ifndef ROSRTL_PATH_H__
+#define ROSRTL_PATH_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+BOOL STDCALL MakeSureDirectoryPathExistsExA(LPCSTR DirPath, BOOL FileAtEnd);
+BOOL STDCALL MakeSureDirectoryPathExistsExW(LPCWSTR DirPath, BOOL FileAtEnd);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+/* EOF */

Added: trunk/reactos/lib/rosrtl/file/path.c
--- trunk/reactos/lib/rosrtl/file/path.c	2005-01-12 06:02:58 UTC (rev 12944)
+++ trunk/reactos/lib/rosrtl/file/path.c	2005-01-12 07:51:11 UTC (rev 12945)
@@ -0,0 +1,100 @@
+#include <windows.h>
+#include <string.h>
+
+
+/***********************************************************************
+ *           MakeSureDirectoryPathExistsExA
+ *
+ * If a dir is at the end and the path ends with a backslash, FileAtEnd
+ * is ignored. If the path doesn't end with a backslash, FileAtEnd is
+ * used to determine if the last part of the path is a file name or a
+ * directory.
+ *
+ * Path may be absolute or relative to current dir.
+ */
+BOOL STDCALL MakeSureDirectoryPathExistsExA(LPCSTR DirPath, BOOL FileAtEnd)
+{
+   char Path[MAX_PATH];
+   char *SlashPos = Path;
+   char Slash;
+   BOOL bRes;
+   
+   strcpy(Path, DirPath);
+        
+   while((SlashPos=strpbrk(SlashPos+1,"\\/")))
+   {
+      Slash = *SlashPos;
+      *SlashPos = 0;
+      
+      bRes = CreateDirectoryA(Path, NULL);
+      if (bRes == FALSE && GetLastError() != ERROR_ALREADY_EXISTS)
+      {
+         return FALSE;
+      }
+      
+      *SlashPos = Slash;
+      
+      if (*(SlashPos+1) == 0) return TRUE;
+   }
+
+   if (!FileAtEnd)
+   {
+      bRes = CreateDirectoryA(Path, NULL);
+      if (bRes == FALSE && GetLastError() != ERROR_ALREADY_EXISTS)
+      {
+         return FALSE;
+      }
+   }
+
+   return TRUE;
+}
+
+
+
+
+/***********************************************************************
+ *           MakeSureDirectoryPathExistsExW
+ *
+ * If a dir is at the end and the path ends with a backslash, FileAtEnd
+ * is ignored. If the path doesn't end with a backslash, FileAtEnd is
+ * used to determine if the last part of the path is a file name or a
+ * directory.
+ *
+ * Path may be absolute or relative to current dir.
+ */
+BOOL STDCALL MakeSureDirectoryPathExistsExW(LPCWSTR DirPath, BOOL FileAtEnd)
+{
+   WCHAR Path[MAX_PATH];
+   WCHAR *SlashPos = Path;
+   WCHAR Slash;
+   BOOL bRes;
+   
+   wcscpy(Path, DirPath);
+        
+   while((SlashPos=wcspbrk(SlashPos+1,L"\\/")))
+   {
+      Slash = *SlashPos;
+      *SlashPos = 0;
+      
+      bRes = CreateDirectoryW(Path, NULL);
+      if (bRes == FALSE && GetLastError() != ERROR_ALREADY_EXISTS)
+      {
+         return FALSE;
+      }
+      
+      *SlashPos = Slash;
+      
+      if (*(SlashPos+1) == 0) return TRUE;
+   }
+
+   if (!FileAtEnd)
+   {
+      bRes = CreateDirectoryW(Path, NULL);
+      if (bRes == FALSE && GetLastError() != ERROR_ALREADY_EXISTS)
+      {
+         return FALSE;
+      }
+   }
+
+   return TRUE;
+}

Modified: trunk/reactos/lib/rosrtl/makefile
--- trunk/reactos/lib/rosrtl/makefile	2005-01-12 06:02:58 UTC (rev 12944)
+++ trunk/reactos/lib/rosrtl/makefile	2005-01-12 07:51:11 UTC (rev 12945)
@@ -30,7 +30,8 @@
  misc/qsort.o
 
 FILE_OBJECTS = \
- file/sparse.o
+ file/sparse.o \
+ file/path.o
 
 RECMUTEX_OBJECTS = recmutex/recmutex.o