diff --git a/reactos/subsys/system/cmd/move.c b/reactos/subsys/system/cmd/move.c index d1aaa8dff8e..33ee381c18c 100644 --- a/reactos/subsys/system/cmd/move.c +++ b/reactos/subsys/system/cmd/move.c @@ -1,29 +1,33 @@ /* - * MOVE.C - move internal command. - * - * - * History: - * - * 14-Dec-1998 (Eric Kohl ) - * Started. - * - * 18-Jan-1999 (Eric Kohl ) - * Unicode safe! - * Preliminary version!!! - * - * 20-Jan-1999 (Eric Kohl ) - * Redirection safe! - * - * 27-Jan-1999 (Eric Kohl ) - * Added help text ("/?"). - * Added more error checks. - * - * 03-Feb-1999 (Eric Kohl ) - * Added "/N" option. - * - * 30-Apr-2005 (Magnus Olsen) ) - * Remove all hardcode string to En.rc - */ +* MOVE.C - move internal command. +* +* +* History: +* +* 14-Dec-1998 (Eric Kohl ) +* Started. +* +* 18-Jan-1999 (Eric Kohl ) +* Unicode safe! +* Preliminary version!!! +* +* 20-Jan-1999 (Eric Kohl ) +* Redirection safe! +* +* 27-Jan-1999 (Eric Kohl ) +* Added help text ("/?"). +* Added more error checks. +* +* 03-Feb-1999 (Eric Kohl ) +* Added "/N" option. +* +* 30-Apr-2005 (Magnus Olsen) ) +* Remove all hardcode string to En.rc +* +* 24-Jun-2005 (Brandon Turner) ) +* Fixed bug to allow MS style wildcards + code clean up +* added /y and /-y +*/ #include "precomp.h" #include "resource.h" @@ -31,32 +35,22 @@ #ifdef INCLUDE_CMD_MOVE -#define OVERWRITE_NO 0 -#define OVERWRITE_YES 1 -#define OVERWRITE_ALL 2 -#define OVERWRITE_CANCEL 3 - +enum +{ + MOVE_NOTHING = 0x001, /* /N */ + MOVE_OVER_YES = 0x002, /* /Y */ + MOVE_OVER_NO = 0x004, /* /-Y */ +}; static INT Overwrite (LPTSTR fn) { + /*ask the user if they want to override*/ TCHAR szMsg[RC_STRING_MAX_SIZE]; - TCHAR inp[10]; - LPTSTR p; - + INT res; LoadString(CMD_ModuleHandle, STRING_MOVE_HELP1, szMsg, RC_STRING_MAX_SIZE); - ConOutPrintf(szMsg, fn); - ConInString(inp, 10); - - _tcsupr (inp); - for (p = inp; _istspace(*p); p++) - ; - - if (*p != szMsg[0] && *p != szMsg[2]) - return OVERWRITE_NO; - if (*p == szMsg[2]) - return OVERWRITE_ALL; - - return OVERWRITE_YES; + ConOutPrintf(szMsg,fn); + res = FilePromptYNA (""); + return res; } @@ -68,29 +62,29 @@ INT cmd_move (LPTSTR cmd, LPTSTR param) INT argc, i, nFiles; TCHAR szDestPath[MAX_PATH]; TCHAR szSrcPath[MAX_PATH]; - BOOL bPrompt = TRUE; - LPTSTR p; + DWORD dwFlags = 0; + INT nOverwrite = 0; WIN32_FIND_DATA findBuffer; HANDLE hFile; LPTSTR pszFile; - BOOL bNothing = FALSE; + if (!_tcsncmp (param, _T("/?"), 2)) { #if 0 ConOutPuts (_T("Moves files and renames files and directories.\n\n" - "To move one or more files:\n" - "MOVE [/N][/Y|/-Y][drive:][path]filename1[,...] destination\n" - "\n" - "To rename a directory:\n" - "MOVE [/N][/Y|/-Y][drive:][path]dirname1 dirname2\n" - "\n" - " [drive:][path]filename1 Specifies the location and name of the file\n" - " or files you want to move.\n" - " /N Nothing. Don everthing but move files or direcories.\n" - " /Y\n" - " /-Y\n" - "...")); + "To move one or more files:\n" + "MOVE [/N][/Y|/-Y][drive:][path]filename1[,...] destination\n" + "\n" + "To rename a directory:\n" + "MOVE [/N][/Y|/-Y][drive:][path]dirname1 dirname2\n" + "\n" + " [drive:][path]filename1 Specifies the location and name of the file\n" + " or files you want to move.\n" + " /N Nothing. Don everthing but move files or direcories.\n" + " /Y\n" + " /-Y\n" + "...")); #else ConOutResPuts(STRING_MOVE_HELP2); #endif @@ -103,23 +97,24 @@ INT cmd_move (LPTSTR cmd, LPTSTR param) /* read options */ for (i = 0; i < argc; i++) { - p = arg[i]; - - if (*p == _T('/')) + if (*arg[i] == _T('/')) { - p++; - if (*p == _T('-')) + if (_tcslen(arg[i]) >= 2) { - p++; - if (_totupper (*p) == _T('Y')) - bPrompt = TRUE; - } - else - { - if (_totupper (*p) == _T('Y')) - bPrompt = FALSE; - else if (_totupper (*p) == _T('N')) - bNothing = TRUE; + switch (_totupper(arg[i][1])) + { + case _T('N'): + dwFlags |= MOVE_NOTHING; + break; + + case _T('Y'): + dwFlags |= MOVE_OVER_YES; + break; + + case _T('-'): + dwFlags |= MOVE_OVER_NO; + break; + } } nFiles--; } @@ -132,13 +127,20 @@ INT cmd_move (LPTSTR cmd, LPTSTR param) return 1; } + if (_tcschr (arg[argc - 1], _T('*')) != NULL) + { + /*'*' in dest, this doesnt happen. give folder name instead*/ + error_parameter_format('2'); + return 1; + } + /* get destination */ GetFullPathName (arg[argc - 1], MAX_PATH, szDestPath, NULL); #ifdef _DEBUG DebugPrintf (_T("Destination: %s\n"), szDestPath); #endif - /* move it*/ + /* move it */ for (i = 0; i < argc - 1; i++) { if (*arg[i] == _T('/')) @@ -154,6 +156,8 @@ INT cmd_move (LPTSTR cmd, LPTSTR param) do { + + nOverwrite = 1; GetFullPathName (findBuffer.cFileName, MAX_PATH, szSrcPath, &pszFile); if (GetFileAttributes (szSrcPath) & FILE_ATTRIBUTE_DIRECTORY) @@ -162,93 +166,100 @@ INT cmd_move (LPTSTR cmd, LPTSTR param) #ifdef _DEBUG DebugPrintf (_T("Move directory \'%s\' to \'%s\'\n"), - szSrcPath, szDestPath); + szSrcPath, szDestPath); #endif - if (!bNothing) - { - MoveFile (szSrcPath, szDestPath); - } + if (!(dwFlags & MOVE_NOTHING)) + continue; + MoveFile (szSrcPath, szDestPath); } else { - /* source is file */ - - if (IsExistingFile (szDestPath)) + /* source is file */ + if (GetFileAttributes (szDestPath) & FILE_ATTRIBUTE_DIRECTORY) { - /* destination exists */ - if (GetFileAttributes (szDestPath) & FILE_ATTRIBUTE_DIRECTORY) - { - /* destination is existing directory */ + /* destination is existing directory */ - TCHAR szFullDestPath[MAX_PATH]; + /*build the dest string(accounts for *)*/ + TCHAR szFullDestPath[MAX_PATH]; + _tcscpy (szFullDestPath, szDestPath); + /*this line causes a one to many slashes, GetFullPathName must + be adding on a \ when it sees that is a dir*/ + //_tcscat (szFullDestPath, _T("\\")); + _tcscat (szFullDestPath, findBuffer.cFileName); - _tcscpy (szFullDestPath, szDestPath); - _tcscat (szFullDestPath, _T("\\")); - _tcscat (szFullDestPath, pszFile); + /*checks to make sure user wanted/wants the override*/ + if((dwFlags & MOVE_OVER_NO) && IsExistingFile (szFullDestPath)) + continue; + if(!(dwFlags & MOVE_OVER_YES) && IsExistingFile (szFullDestPath)) + nOverwrite = Overwrite (szFullDestPath); + if (nOverwrite == PROMPT_NO || nOverwrite == PROMPT_BREAK) + continue; + if (nOverwrite == PROMPT_ALL) + dwFlags |= MOVE_OVER_YES; - ConOutPrintf (_T("%s => %s"), szSrcPath, szFullDestPath); + /*delete the file that might be there first*/ + DeleteFile(szFullDestPath); + ConOutPrintf (_T("%s => %s"), szSrcPath, szFullDestPath); - if (!bNothing) - { - if (MoveFile (szSrcPath, szFullDestPath)) - LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE); - else - LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR2, szMsg, RC_STRING_MAX_SIZE); - ConOutPrintf(szMsg); - } - } + if ((dwFlags & MOVE_NOTHING)) + continue; + + /*delete the file that might be there first*/ + DeleteFile(szFullDestPath); + /*move the file*/ + if (MoveFile (szSrcPath, szFullDestPath)) + LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE); else - { - /* destination is existing file */ - INT nOverwrite; + LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR2, szMsg, RC_STRING_MAX_SIZE); - /* must get the overwrite code */ - if ((nOverwrite = Overwrite (szDestPath))) - { -#if 0 - if (nOverwrite == OVERWRITE_ALL) - *lpFlags |= FLAG_OVERWRITE_ALL; -#endif - ConOutPrintf (_T("%s => %s"), szSrcPath, szDestPath); - - if (!bNothing) - { - if (MoveFile (szSrcPath, szDestPath)) - LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE); - else - LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR2, szMsg, RC_STRING_MAX_SIZE); - ConOutPrintf(szMsg); - } - } - } + ConOutPrintf(szMsg); } else { - /* destination does not exist */ - TCHAR szFullDestPath[MAX_PATH]; + /* destination is a file */ - GetFullPathName (szDestPath, MAX_PATH, szFullDestPath, NULL); - - ConOutPrintf (_T("%s => %s"), szSrcPath, szFullDestPath); - - if (!bNothing) + if (_tcschr (arg[argc - 2], _T('*')) != NULL) { - if (MoveFile (szSrcPath, szFullDestPath)) - LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE); - else - LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR2, szMsg, RC_STRING_MAX_SIZE); - ConOutPrintf(szMsg); + /*'*' in src but there should't be one in the dest*/ + error_parameter_format('1'); + return 1; } + + /*bunch of checks to see if we the user wanted/wants + to really override the files*/ + if((dwFlags & MOVE_OVER_NO) && IsExistingFile (szDestPath)) + continue; + if(!(dwFlags & MOVE_OVER_YES) && IsExistingFile (szDestPath)) + nOverwrite = Overwrite (szDestPath); + if (nOverwrite == PROMPT_NO || nOverwrite == PROMPT_BREAK) + continue; + if (nOverwrite == PROMPT_ALL) + dwFlags |= MOVE_OVER_YES; + + ConOutPrintf (_T("%s => %s"), szSrcPath, szDestPath); + + if ((dwFlags & MOVE_NOTHING)) + continue; + + /*delete the file first just to get ride of it + if it was already there*/ + DeleteFile(szDestPath); + /*do the moving*/ + if (MoveFile (szSrcPath, szDestPath)) + LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR1, szMsg, RC_STRING_MAX_SIZE); + else + LoadString(CMD_ModuleHandle, STRING_MOVE_ERROR2, szMsg, RC_STRING_MAX_SIZE); + + ConOutPrintf(szMsg); + } } } while (FindNextFile (hFile, &findBuffer)); - FindClose (hFile); } freep (arg); - return 0; }