cmd: mkdir: Set errorlevel and output error message if final directory already exists.

This commit is contained in:
Dan Kegel 2011-08-02 12:35:36 -07:00 committed by Alexandre Julliard
parent 3cd864bdf8
commit 6990cdfe96
3 changed files with 41 additions and 43 deletions

View File

@ -473,54 +473,45 @@ void WCMD_copy (void) {
/**************************************************************************** /****************************************************************************
* WCMD_create_dir * WCMD_create_dir
* *
* Create a directory. * Create a directory (and, if needed, any intermediate directories).
* *
* this works recursively. so mkdir dir1\dir2\dir3 will create dir1 and dir2 if * Modifies its argument by replacing slashes temporarily with nulls.
* they do not already exist.
*/ */
static BOOL create_full_path(WCHAR* path) static BOOL create_full_path(WCHAR* path)
{ {
int len; WCHAR *p, *start;
WCHAR *new_path;
BOOL ret = TRUE;
new_path = HeapAlloc(GetProcessHeap(),0,(strlenW(path)+1) * sizeof(WCHAR)); /* don't mess with drive letter portion of path, if any */
strcpyW(new_path,path); start = path;
if (path[1] == ':')
start = path+2;
while ((len = strlenW(new_path)) && new_path[len - 1] == '\\') /* Strip trailing slashes. */
new_path[len - 1] = 0; for (p = path + strlenW(path) - 1; p != start && *p == '\\'; p--)
*p = 0;
while (!CreateDirectoryW(new_path,NULL)) /* Step through path, creating intermediate directories as needed. */
{ /* First component includes drive letter, if any. */
WCHAR *slash; p = start;
DWORD last_error = GetLastError(); for (;;) {
if (last_error == ERROR_ALREADY_EXISTS) DWORD rv;
break; /* Skip to end of component */
while (*p == '\\') p++;
if (last_error != ERROR_PATH_NOT_FOUND) while (*p && *p != '\\') p++;
{ if (!*p) {
ret = FALSE; /* path is now the original full path */
break; return CreateDirectoryW(path, NULL);
} }
/* Truncate path, create intermediate directory, and restore path */
if (!(slash = strrchrW(new_path,'\\')) && ! (slash = strrchrW(new_path,'/'))) *p = 0;
{ rv = CreateDirectoryW(path, NULL);
ret = FALSE; *p = '\\';
break; if (!rv && GetLastError() != ERROR_ALREADY_EXISTS)
} return FALSE;
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); /* notreached */
return ret; return FALSE;
} }
void WCMD_create_dir (WCHAR *command) { void WCMD_create_dir (WCHAR *command) {

View File

@ -518,6 +518,11 @@ if exist foobar (echo foobar created) else echo foobar not created!
if exist bar\baz (echo bar\baz created) else echo bar\baz not created! if exist bar\baz (echo bar\baz created) else echo bar\baz not created!
cd .. cd ..
rd /s/q foobaz rd /s/q foobaz
call :setError 0
mkdir foo\*
echo mkdir foo\* errorlevel %ErrorLevel%
if exist foo (rmdir foo & echo ok, foo created
) else ( echo bad, foo not created )
echo ----------- Testing rmdir ----------- echo ----------- Testing rmdir -----------
call :setError 0 call :setError 0

View File

@ -264,14 +264,14 @@ del /q * succeeded on file2.dat
----------- Testing mkdir ----------- ----------- Testing mkdir -----------
0 0
0 0
@todo_wine@1 1
@todo_wine@1 1
0 0
0 0
0 0
0 0
0 0
@todo_wine@1 1
0 0
0 0
0 0
@ -280,13 +280,15 @@ dir created
mkdir ? gives errorlevel 1 mkdir ? gives errorlevel 1
mkdir ?\foo gives errorlevel 1 mkdir ?\foo gives errorlevel 1
mkdir foo\? gives errorlevel 1 mkdir foo\? gives errorlevel 1
@todo_wine@ok, foo created ok, foo created
mkdir foo\bar\? gives errorlevel 1 mkdir foo\bar\? gives errorlevel 1
@todo_wine@ok, foo\bar created ok, foo\bar created
foo created foo created
bar created bar created
foobar created foobar created
bar\baz created bar\baz created
mkdir foo\* errorlevel 1
ok, foo created
----------- Testing rmdir ----------- ----------- Testing rmdir -----------
0 0
dir removed dir removed