xcopy: Prompt when overwriting files, add /Y and /-Y support.
This commit is contained in:
parent
59bf2dc341
commit
70fe414c2a
|
@ -48,6 +48,7 @@
|
||||||
#define OPT_SIMULATE 0x00000020
|
#define OPT_SIMULATE 0x00000020
|
||||||
#define OPT_PAUSE 0x00000040
|
#define OPT_PAUSE 0x00000040
|
||||||
#define OPT_NOCOPY 0x00000080
|
#define OPT_NOCOPY 0x00000080
|
||||||
|
#define OPT_NOPROMPT 0x00000100
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(xcopy);
|
WINE_DEFAULT_DEBUG_CHANNEL(xcopy);
|
||||||
|
|
||||||
|
@ -134,6 +135,8 @@ int main (int argc, char *argv[])
|
||||||
case 'L': flags |= OPT_SIMULATE; break;
|
case 'L': flags |= OPT_SIMULATE; break;
|
||||||
case 'W': flags |= OPT_PAUSE; break;
|
case 'W': flags |= OPT_PAUSE; break;
|
||||||
case 'T': flags |= OPT_NOCOPY | OPT_RECURSIVE; break;
|
case 'T': flags |= OPT_NOCOPY | OPT_RECURSIVE; break;
|
||||||
|
case 'Y': flags |= OPT_NOPROMPT; break;
|
||||||
|
case '-': if (argvW[0][2]=='Y') flags &= ~OPT_NOPROMPT; break;
|
||||||
default:
|
default:
|
||||||
WINE_FIXME("Unhandled parameter '%s'\n", wine_dbgstr_w(*argvW));
|
WINE_FIXME("Unhandled parameter '%s'\n", wine_dbgstr_w(*argvW));
|
||||||
}
|
}
|
||||||
|
@ -179,7 +182,6 @@ int main (int argc, char *argv[])
|
||||||
destinationstem, destinationspec,
|
destinationstem, destinationspec,
|
||||||
flags);
|
flags);
|
||||||
|
|
||||||
|
|
||||||
/* Finished - print trailer and exit */
|
/* Finished - print trailer and exit */
|
||||||
if (flags & OPT_SIMULATE) {
|
if (flags & OPT_SIMULATE) {
|
||||||
printf("%d file(s) would be copied\n", filesCopied);
|
printf("%d file(s) would be copied\n", filesCopied);
|
||||||
|
@ -366,6 +368,8 @@ static int XCOPY_DoCopy(WCHAR *srcstem, WCHAR *srcspec,
|
||||||
BOOL findres = TRUE;
|
BOOL findres = TRUE;
|
||||||
WCHAR *inputpath, *outputpath;
|
WCHAR *inputpath, *outputpath;
|
||||||
BOOL copiedFile = FALSE;
|
BOOL copiedFile = FALSE;
|
||||||
|
DWORD destAttribs;
|
||||||
|
BOOL skipFile;
|
||||||
|
|
||||||
/* Allocate some working memory on heap to minimize footprint */
|
/* Allocate some working memory on heap to minimize footprint */
|
||||||
finddata = HeapAlloc(GetProcessHeap(), 0, sizeof(WIN32_FIND_DATA));
|
finddata = HeapAlloc(GetProcessHeap(), 0, sizeof(WIN32_FIND_DATA));
|
||||||
|
@ -380,6 +384,8 @@ static int XCOPY_DoCopy(WCHAR *srcstem, WCHAR *srcspec,
|
||||||
h = FindFirstFile(inputpath, finddata);
|
h = FindFirstFile(inputpath, finddata);
|
||||||
while (h != INVALID_HANDLE_VALUE && findres) {
|
while (h != INVALID_HANDLE_VALUE && findres) {
|
||||||
|
|
||||||
|
skipFile = FALSE;
|
||||||
|
|
||||||
/* Ignore . and .. */
|
/* Ignore . and .. */
|
||||||
if (lstrcmpW(finddata->cFileName, wchr_dot)==0 ||
|
if (lstrcmpW(finddata->cFileName, wchr_dot)==0 ||
|
||||||
lstrcmpW(finddata->cFileName, wchr_dotdot)==0 ||
|
lstrcmpW(finddata->cFileName, wchr_dotdot)==0 ||
|
||||||
|
@ -404,7 +410,30 @@ static int XCOPY_DoCopy(WCHAR *srcstem, WCHAR *srcspec,
|
||||||
wine_dbgstr_w(copyTo));
|
wine_dbgstr_w(copyTo));
|
||||||
if (!copiedFile && !(flags & OPT_SIMULATE)) XCOPY_CreateDirectory(deststem);
|
if (!copiedFile && !(flags & OPT_SIMULATE)) XCOPY_CreateDirectory(deststem);
|
||||||
|
|
||||||
|
/* See if file exists */
|
||||||
|
destAttribs = GetFileAttributesW(copyTo);
|
||||||
|
if (destAttribs != INVALID_FILE_ATTRIBUTES && !(flags & OPT_NOPROMPT)) {
|
||||||
|
DWORD count;
|
||||||
|
char answer[10];
|
||||||
|
BOOL answered = FALSE;
|
||||||
|
|
||||||
|
while (!answered) {
|
||||||
|
printf("Overwrite %S? (Yes|No|All)\n", copyTo);
|
||||||
|
ReadFile (GetStdHandle(STD_INPUT_HANDLE), answer, sizeof(answer),
|
||||||
|
&count, NULL);
|
||||||
|
|
||||||
|
answered = TRUE;
|
||||||
|
if (toupper(answer[0]) == 'A')
|
||||||
|
flags |= OPT_NOPROMPT;
|
||||||
|
else if (toupper(answer[0]) == 'N')
|
||||||
|
skipFile = TRUE;
|
||||||
|
else if (toupper(answer[0]) != 'Y')
|
||||||
|
answered = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Output a status message */
|
/* Output a status message */
|
||||||
|
if (!skipFile) {
|
||||||
if (flags & OPT_QUIET) {
|
if (flags & OPT_QUIET) {
|
||||||
/* Skip message */
|
/* Skip message */
|
||||||
} else if (flags & OPT_FULL) {
|
} else if (flags & OPT_FULL) {
|
||||||
|
@ -416,12 +445,13 @@ static int XCOPY_DoCopy(WCHAR *srcstem, WCHAR *srcspec,
|
||||||
copiedFile = TRUE;
|
copiedFile = TRUE;
|
||||||
if (flags & OPT_SIMULATE || flags & OPT_NOCOPY) {
|
if (flags & OPT_SIMULATE || flags & OPT_NOCOPY) {
|
||||||
/* Skip copy */
|
/* Skip copy */
|
||||||
} else if (CopyFile(copyFrom, copyTo, TRUE) == 0) {
|
} else if (CopyFile(copyFrom, copyTo, FALSE) == 0) {
|
||||||
printf("Copying of '%S' to '%S' failed with r/c %d\n",
|
printf("Copying of '%S' to '%S' failed with r/c %d\n",
|
||||||
copyFrom, copyTo, GetLastError());
|
copyFrom, copyTo, GetLastError());
|
||||||
}
|
}
|
||||||
filesCopied++;
|
filesCopied++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Find next file */
|
/* Find next file */
|
||||||
findres = FindNextFile(h, finddata);
|
findres = FindNextFile(h, finddata);
|
||||||
|
|
Loading…
Reference in New Issue