cmd: mkdir: Set errorlevel and output error message if final directory already exists.
This commit is contained in:
parent
3cd864bdf8
commit
6990cdfe96
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue