Author: fireball Date: Thu Sep 27 12:35:08 2007 New Revision: 29240
URL: http://svn.reactos.org/svn/reactos?rev=29240&view=rev Log: Samuel Erdtman samuel@erdtman.se - Implement 'replace' command in cmd. - TODO: Update all translations with the new text strings for replace command.
Added: trunk/reactos/base/shell/cmd/replace.c (with props) Modified: trunk/reactos/base/shell/cmd/cmd.h trunk/reactos/base/shell/cmd/cmd.rbuild trunk/reactos/base/shell/cmd/cmdtable.c trunk/reactos/base/shell/cmd/config.h trunk/reactos/base/shell/cmd/files.txt trunk/reactos/base/shell/cmd/lang/en-US.rc trunk/reactos/base/shell/cmd/resource.h
Modified: trunk/reactos/base/shell/cmd/cmd.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/cmd.h?rev=29... ============================================================================== --- trunk/reactos/base/shell/cmd/cmd.h (original) +++ trunk/reactos/base/shell/cmd/cmd.h Thu Sep 27 12:35:08 2007 @@ -347,6 +347,8 @@ /* Prototypes for REN.C */ INT cmd_rename (LPTSTR, LPTSTR);
+/* Prototypes for REN.C */ +INT cmd_replace (LPTSTR, LPTSTR);
/* Prototypes for SCREEN.C */ INT CommandScreen (LPTSTR, LPTSTR);
Modified: trunk/reactos/base/shell/cmd/cmd.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/cmd.rbuild?r... ============================================================================== --- trunk/reactos/base/shell/cmd/cmd.rbuild (original) +++ trunk/reactos/base/shell/cmd/cmd.rbuild Thu Sep 27 12:35:08 2007 @@ -52,6 +52,7 @@ <file>prompt.c</file> <file>redir.c</file> <file>ren.c</file> + <file>replace.c</file> <file>screen.c</file> <file>set.c</file> <file>shift.c</file> @@ -82,4 +83,4 @@ <file>cmd.rc</file> <file>main.c</file> </module> -</group> +</group>
Modified: trunk/reactos/base/shell/cmd/cmdtable.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/cmdtable.c?r... ============================================================================== --- trunk/reactos/base/shell/cmd/cmdtable.c (original) +++ trunk/reactos/base/shell/cmd/cmdtable.c Thu Sep 27 12:35:08 2007 @@ -174,6 +174,10 @@ #ifdef INCLUDE_CMD_RENAME {_T("ren"), 0, cmd_rename}, {_T("rename"), 0, cmd_rename}, +#endif + +#ifdef INCLUDE_CMD_REPLACE + {_T("replace"), 0, cmd_replace}, #endif
#ifdef INCLUDE_CMD_RMDIR
Modified: trunk/reactos/base/shell/cmd/config.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/config.h?rev... ============================================================================== --- trunk/reactos/base/shell/cmd/config.h (original) +++ trunk/reactos/base/shell/cmd/config.h Thu Sep 27 12:35:08 2007 @@ -79,6 +79,7 @@ #define INCLUDE_CMD_PROMPT #define INCLUDE_CMD_RMDIR #define INCLUDE_CMD_RENAME +#define INCLUDE_CMD_REPLACE #define INCLUDE_CMD_SCREEN #define INCLUDE_CMD_SET #define INCLUDE_CMD_START
Modified: trunk/reactos/base/shell/cmd/files.txt URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/files.txt?re... ============================================================================== --- trunk/reactos/base/shell/cmd/files.txt (original) +++ trunk/reactos/base/shell/cmd/files.txt Thu Sep 27 12:35:08 2007 @@ -47,6 +47,7 @@ prompt.c Prompt handling functions redir.c Redirection and piping parsing functions ren.c Implements rename command +replace.c Implements replace command set.c Implements set command shift.c Implements shift command time.c Implements time command
Modified: trunk/reactos/base/shell/cmd/lang/en-US.rc URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/lang/en-US.r... ============================================================================== --- trunk/reactos/base/shell/cmd/lang/en-US.rc (original) +++ trunk/reactos/base/shell/cmd/lang/en-US.rc Thu Sep 27 12:35:08 2007 @@ -389,6 +389,46 @@ STRING_REN_HELP2, " %lu file renamed\n"
STRING_REN_HELP3, " %lu files renamed\n" + +STRING_REPLACE_HELP1, "Replaces files.\n\n\ +REPLACE [drive1:][path1]filename [drive2:][path2] [/A] [/P] [/R] [/W]\n\ +REPLACE [drive1:][path1]filename [drive2:][path2] [/P] [/R] [/S] [/W] [/U]\n\n\ + [drive1:][path1]filename Specifies the source file or files.\n\ + [drive2:][path2] Specifies the directory where files are to be\n\ + replaced.\n\ + /A Adds new files to destination directory. Cannot\n\ + use with /S or /U switches.\n\ + /P Prompts for confirmation before replacing a file or\n\ + adding a source file.\n\ + /R Replaces read-only files as well as unprotected\n\ + files.\n\ + /S Replaces files in all subdirectories of the\n\ + destination directory. Cannot use with the /A\n\ + switch.\n\ + /W Waits for you to insert a disk before beginning.\n\ + /U Replaces (updates) only files that are older than\n\ + source files. Cannot use with the /A switch.\n" + +STRING_REPLACE_HELP2, "Source path required\n" + +STRING_REPLACE_HELP3, "No files replaced\n" + +STRING_REPLACE_HELP4, "%lu file(s) replaced\n" + +STRING_REPLACE_HELP5, "Replacing %s\n" + +STRING_REPLACE_HELP6, "Replace %s\n" + +STRING_REPLACE_HELP7, "No files added\n" + +STRING_REPLACE_HELP8, "%lu file(s) added\n" + +STRING_REPLACE_HELP9, "Add %s (Y/N) " + +STRING_REPLACE_HELP10, "Replace %s (Y/N) " + +STRING_REPLACE_HELP11, "Adding %s\n" +
STRING_SHIFT_HELP, "Changes the position of replaceable parameters in a batch file.\n\n\ SHIFT [DOWN]" @@ -548,6 +588,7 @@ REM Records comments (remarks) in batch files.\n\ REN Renames a file or files.\n\ RENAME Renames a file or files.\n\ +REPLACE Replaces files.\n\ RMDIR Removes a directory.\n\ SCREEN Move cursor and optionally print text.\n\ SET Displays, sets, or removes ReactOS environment variables.\n\ @@ -636,6 +677,14 @@
STRING_PATH_ERROR, "CMD: Not in environment '%s'\n"
+STRING_REPLACE_ERROR1, "Invalid switch - %s\n" +STRING_REPLACE_ERROR2, "Path not found - %s\n" +STRING_REPLACE_ERROR3, "The filename, directory name, or volume label syntax is incorrect.\n" +STRING_REPLACE_ERROR4, "Invalid parameter combination\n" +STRING_REPLACE_ERROR5, "Access denied - %s\n" +STRING_REPLACE_ERROR6, "No files found - %s\n" +STRING_REPLACE_ERROR7, "Extended Error 32\n" + STRING_CMD_SHELLINFO, "\nReactOS Command Line Interpreter" STRING_VERSION_RUNVER, " running on %s" STRING_COPY_FILE , " %d file(s) copied\n"
Added: trunk/reactos/base/shell/cmd/replace.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/replace.c?re... ============================================================================== --- trunk/reactos/base/shell/cmd/replace.c (added) +++ trunk/reactos/base/shell/cmd/replace.c Thu Sep 27 12:35:08 2007 @@ -1,0 +1,576 @@ +/* + * PROJECT: ReactOS Command shell + * LICENSE: GPL - See COPYING in the top level directory + * FILE: base/shell/cmd/replace.c + * PURPOSE: Implements 'replace' cmd command + * PROGRAMMERS: Samuel Erdtman (samuel@erdtman.se) + */ + +/* INCLUDES ******************************************************************/ + +#include <precomp.h> + +#ifdef INCLUDE_CMD_REPLACE + +/* GLOBALS *******************************************************************/ + +enum +{ + REPLACE_ADD = 0x001, /* /A */ + REPLACE_CONFIRM = 0x002, /* /P */ + REPLACE_READ_ONLY = 0x004, /* /R */ + REPLACE_SUBDIR = 0x008, /* /S */ + REPLACE_DISK = 0x010, /* /W */ + REPLACE_UPDATE = 0x020, /* /U */ +}; + +/* FUNCTIONS *****************************************************************/ + +/*just makes a print out if there is a problem with the switches*/ +void invalid_switch(LPTSTR is) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + + LoadString(CMD_ModuleHandle, STRING_REPLACE_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg,is); + ConOutResPaging(TRUE,STRING_REPLACE_HELP3); +} + +/*retrives the pathe dependen om the input file name*/ +void getPath(TCHAR* out, LPTSTR in) +{ + if(_tcslen(in) == 2 && in[1] == _T(':')) + GetRootPath(in,out,MAX_PATH); + else + GetFullPathName (in, MAX_PATH, out, NULL); +} + + +/*makes the replace*/ +INT replace(TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], DWORD dwFlags, BOOL *doMore) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR d[MAX_PATH]; + TCHAR s[MAX_PATH]; + HANDLE hFileSrc, hFileDest; + DWORD dwAttrib, dwRead, dwWritten; + LPBYTE buffer; + BOOL bEof = FALSE; + FILETIME srcCreationTime, destCreationTime, srcLastAccessTime, destLastAccessTime; + FILETIME srcLastWriteTime, destLastWriteTime; + GetPathCase(source, s); + GetPathCase(dest, d); + s[0] = _totupper(s[0]); + d[0] = _totupper(d[0]); +// ConOutPrintf(_T("old-src: %s\n"), s); +// ConOutPrintf(_T("old-dest: %s\n"), d); +// ConOutPrintf(_T("src: %s\n"), source); +// ConOutPrintf(_T("dest: %s\n"), dest); + + /* Open up the sourcefile */ + hFileSrc = CreateFile (source, GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING, 0, NULL); + if (hFileSrc == INVALID_HANDLE_VALUE) + { + LoadString(CMD_ModuleHandle, STRING_COPY_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, source); + return 0; + } + + /* Get the time from source file to be used in the comparison with + dest time if update switch is set */ + GetFileTime (hFileSrc, &srcCreationTime, &srcLastAccessTime, &srcLastWriteTime); + + /* Retrieve the source attributes so that they later on can be + inserted in to the destination */ + dwAttrib = GetFileAttributes (source); + + if(IsExistingFile (dest)) + { + /* Resets the attributes to avoid probles with read only files, + checks for read only has been made earlier */ + SetFileAttributes(dest,FILE_ATTRIBUTE_NORMAL); + /* Is the update flas set? The time has to be controled so that + only older files are replaced */ + if(dwFlags & REPLACE_UPDATE) + { + /* Read destination time */ + hFileDest = CreateFile(dest, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, + 0, NULL); + + if (hFileSrc == INVALID_HANDLE_VALUE) + { + LoadString(CMD_ModuleHandle, STRING_COPY_ERROR1, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, dest); + return 0; + } + + /* Compare time */ + GetFileTime (hFileDest, &destCreationTime, &destLastAccessTime, &destLastWriteTime); + if(!((srcLastWriteTime.dwHighDateTime > destLastWriteTime.dwHighDateTime) || + ( srcLastWriteTime.dwHighDateTime == destLastWriteTime.dwHighDateTime && + srcLastWriteTime.dwLowDateTime > destLastWriteTime.dwLowDateTime))) + { + CloseHandle (hFileSrc); + CloseHandle (hFileDest); + return 0; + } + CloseHandle (hFileDest); + } + /* Delete the old file */ + DeleteFile (dest); + } + + /* Check confirm flag, and take appropriate action */ + if(dwFlags & REPLACE_CONFIRM) + { + /* Output depending on add flag */ + if(dwFlags & REPLACE_ADD) + LoadString(CMD_ModuleHandle, STRING_REPLACE_HELP9, szMsg, RC_STRING_MAX_SIZE); + else + LoadString(CMD_ModuleHandle, STRING_REPLACE_HELP10, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, dest); + if( !FilePromptYNA (_T(""))) + return 0; + } + + /* Output depending on add flag */ + if(dwFlags & REPLACE_ADD) + LoadString(CMD_ModuleHandle, STRING_REPLACE_HELP11, szMsg, RC_STRING_MAX_SIZE); + else + LoadString(CMD_ModuleHandle, STRING_REPLACE_HELP5, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg,dest); + + /* Make sure source and destination is not the same */ + if(!_tcscmp(s, d)) + { + ConOutResPaging(TRUE, STRING_REPLACE_ERROR7); + CloseHandle (hFileSrc); + *doMore = FALSE; + return 0; + } + + /* Open destination file to write to */ + hFileDest = CreateFile (dest, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + if (hFileDest == INVALID_HANDLE_VALUE) + { + CloseHandle (hFileSrc); + ConOutResPaging(TRUE, STRING_REPLACE_ERROR7); + *doMore = FALSE; + return 0; + } + + /* Get buffer for the copy process */ + buffer = (LPBYTE)VirtualAlloc(NULL, BUFF_SIZE, MEM_COMMIT, PAGE_READWRITE); + if (buffer == NULL) + { + CloseHandle (hFileDest); + CloseHandle (hFileSrc); + ConOutResPaging(TRUE, STRING_ERROR_OUT_OF_MEMORY); + return 0; + } + + /* Put attribute and time to the new destination file */ + SetFileAttributes (dest, dwAttrib); + SetFileTime (hFileDest, &srcCreationTime, &srcLastAccessTime, &srcLastWriteTime); + do + { + /* Read data from source */ + ReadFile (hFileSrc, buffer, BUFF_SIZE, &dwRead, NULL); + + /* Done? */ + if (dwRead == 0) + break; + + /* Write to destination file */ + WriteFile (hFileDest, buffer, dwRead, &dwWritten, NULL); + + /* Done! or ctrl break! */ + if (dwWritten != dwRead || CheckCtrlBreak(BREAK_INPUT)) + { + ConOutResPuts(STRING_COPY_ERROR3); + cmd_free (buffer); + CloseHandle (hFileDest); + CloseHandle (hFileSrc); + nErrorLevel = 1; + return 0; + } + } + while (!bEof); + + /* Return memory and close files */ + VirtualFree (buffer, 0, MEM_RELEASE); + CloseHandle (hFileDest); + CloseHandle (hFileSrc); + + /* Return one file replaced */ + return 1; +} + + +/* Function to iterate over source files and call replace for each of them */ +INT recReplace(DWORD dwFlags, TCHAR szSrcPath[MAX_PATH], TCHAR szDestPath[MAX_PATH], BOOL *doMore) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE], tmpDestPath[MAX_PATH], tmpSrcPath[MAX_PATH]; + INT filesReplaced=0, i; + DWORD dwAttrib = 0; + HANDLE hFile; + WIN32_FIND_DATA findBuffer; + + /* Get file handel to the sourcefile(s) */ + hFile = FindFirstFile (szSrcPath, &findBuffer); + + /* Strip the paths back to the folder they are in, so that the diffrent + filenames can be added if more than one */ + for(i = (_tcslen(szSrcPath) - 1); i > -1; i--) + if(szSrcPath[i] != _T('\')) + szSrcPath[i] = _T('\0'); + else + break; + + /* Go through all the soursfiles and copy/replace them */ + do + { + if(CheckCtrlBreak(BREAK_INPUT)) + { + return filesReplaced; + } + + /* Problem with file handler */ + if(hFile == INVALID_HANDLE_VALUE) + return filesReplaced; + + /* We do not want to replace any .. . ocr directory */ + if(!_tcscmp (findBuffer.cFileName, _T(".")) || + !_tcscmp (findBuffer.cFileName, _T(".."))|| + findBuffer.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; + + /* Add filename to destpath */ + _tcscpy(tmpDestPath,szDestPath); + _tcscat (tmpDestPath, findBuffer.cFileName); + + dwAttrib = GetFileAttributes(tmpDestPath); + /* Check add flag */ + if(dwFlags & REPLACE_ADD) + { + if(IsExistingFile(tmpDestPath)) + continue; + else + dwAttrib = 0; + } + else + { + if(!IsExistingFile(tmpDestPath)) + continue; + } + + /* Check if file is read only, if so check if that should be ignored */ + if(dwAttrib & FILE_ATTRIBUTE_READONLY) + { + if(!(dwFlags & REPLACE_READ_ONLY)) + { + LoadString(CMD_ModuleHandle, STRING_REPLACE_ERROR5, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, tmpDestPath); + *doMore = FALSE; + break; + } + } + + /* Add filename to sourcepath, insted of wildcards */ + _tcscpy(tmpSrcPath,szSrcPath); + _tcscat (tmpSrcPath, findBuffer.cFileName); + + /* Make the replace */ + if(replace(tmpSrcPath,tmpDestPath, dwFlags, doMore)) + { + filesReplaced++; + } + else if (!*doMore) + { + /* The file to be replaced was the same as the source */ + filesReplaced = -1; + break; + } + + /* Take next sourcefile if any */ + }while(FindNextFile (hFile, &findBuffer)); + + return filesReplaced; +} + +/* If /s switch is specifyed all subdirs has to be considered */ +INT recFindSubDirs(DWORD dwFlags, + TCHAR szSrcPath[MAX_PATH], + TCHAR szDestPath[MAX_PATH], + BOOL *doMore) +{ + HANDLE hFile; + WIN32_FIND_DATA findBuffer; + TCHAR tmpDestPath[MAX_PATH], tmpSrcPath[MAX_PATH]; + INT filesReplaced = 0, i; + + /* Add a wildcard to dest end so the it will be easy to itterate + over all the files and directorys in the dest directory */ + _tcscat(szDestPath, _T("*")); + + /* Get the first file in the directory */ + hFile = FindFirstFile (szDestPath, &findBuffer); + + /* Remove the star added earlyer to dest path */ + for(i = (_tcslen(szDestPath) - 1); i > -1; i--) + if(szDestPath[i] != _T('\')) + szDestPath[i] = _T('\0'); + else + break; + + /* Iterate over all filed directories in the dest dir */ + do + { + /* Save the source path so that it will not be wrecked */ + _tcscpy(tmpSrcPath,szSrcPath); + /* Check for reading problems */ + if(hFile == INVALID_HANDLE_VALUE) + { + ConOutFormatMessage (GetLastError(), tmpSrcPath); + return filesReplaced; + } + + /* Check if the we should enter the dir or if it is a file + or . or .. if so thake the next object to process */ + if(!_tcscmp (findBuffer.cFileName, _T(".")) || + !_tcscmp (findBuffer.cFileName, _T(".."))|| + IsExistingFile(findBuffer.cFileName)) + continue; + /* Add the destpath and the new dir path to tempDestPath */ + _tcscpy(tmpDestPath,szDestPath); + _tcscat (tmpDestPath, findBuffer.cFileName); + /* Make sure that we have a directory */ + if(IsExistingDirectory(tmpDestPath)) + { + /* Add a \ to the end or the path */ + if(szDestPath[_tcslen(tmpDestPath) - 1] != _T('\')) + _tcscat(tmpDestPath, _T("\")); + /* Call the function to replace files in the new directory */ + filesReplaced += recReplace(dwFlags, tmpSrcPath, tmpDestPath, doMore); + /* If there were problems break e.g. read-only file */ + if(!*doMore) + break; + _tcscpy(tmpSrcPath,szSrcPath); + /* Controle the next level of subdirs */ + filesReplaced += recFindSubDirs(dwFlags,tmpSrcPath,tmpDestPath, doMore); + if(!*doMore) + break; + } + /* Get the next handle */ + } while(FindNextFile (hFile, &findBuffer)); + + return filesReplaced; +} + +INT cmd_replace (LPTSTR cmd, LPTSTR param) +{ + TCHAR szMsg[RC_STRING_MAX_SIZE]; + LPTSTR *arg; + INT argc, i,filesReplaced = 0, nFiles, srcIndex = -1, destIndex = -1; + DWORD dwFlags = 0; + TCHAR szDestPath[MAX_PATH], szSrcPath[MAX_PATH], tmpSrcPath[MAX_PATH]; + BOOL doMore = TRUE; + + /* Help wanted? */ + if (!_tcsncmp (param, _T("/?"), 2)) + { + ConOutResPaging(TRUE,STRING_REPLACE_HELP1); + return 0; + } + + /* Divide the argument in to an array of c-strings */ + arg = split (param, &argc, FALSE); + nFiles = argc; + + /* Read options */ + for (i = 0; i < argc; i++) + { + if (arg[i][0] == _T('/')) + { + if (_tcslen(arg[i]) == 2) + { + switch (_totupper(arg[i][1])) + { + case _T('A'): + dwFlags |= REPLACE_ADD; + break; + case _T('P'): + dwFlags |= REPLACE_CONFIRM; + break; + case _T('R'): + dwFlags |= REPLACE_READ_ONLY; + break; + case _T('S'): + dwFlags |= REPLACE_SUBDIR; + break; + case _T('W'): + dwFlags |= REPLACE_DISK; + break; + case _T('U'): + dwFlags |= REPLACE_UPDATE; + break; + default: + invalid_switch(arg[i]); + return 0; + } + } + else + { + invalid_switch(arg[i]); + freep(arg); + return 0; + } + nFiles--; + } + else + { + if(srcIndex == -1) + { + srcIndex = i; + } + else if(destIndex == -1) + { + destIndex = i; + } + else + { + invalid_switch(arg[i]); + freep(arg); + return 0; + } + } + } + + /* See so that at least source is there */ + if (nFiles < 1) + { + ConOutResPaging(TRUE,STRING_REPLACE_HELP2); + ConOutResPaging(TRUE,STRING_REPLACE_HELP3); + freep(arg); + return 1; + } + /* Check so that not both update and add switch is added and subdir */ + if((dwFlags & REPLACE_UPDATE || dwFlags & REPLACE_SUBDIR) && (dwFlags & REPLACE_ADD)) + { + ConOutResPaging(TRUE,STRING_REPLACE_ERROR4); + ConOutResPaging(TRUE,STRING_REPLACE_HELP7); + freep(arg); + return 1; + } + + /* If we have a destination get the full path */ + if(destIndex != -1) + { + if(_tcslen(arg[destIndex]) == 2 && arg[destIndex][1] == ':') + GetRootPath(arg[destIndex],szDestPath,MAX_PATH); + else + { + /* Check for wildcards in destination directory */ + if (_tcschr (arg[destIndex], _T('*')) != NULL || + _tcschr (arg[destIndex], _T('?')) != NULL) + { + LoadString(CMD_ModuleHandle, STRING_REPLACE_ERROR2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg,arg[destIndex]); + ConOutResPaging(TRUE,STRING_REPLACE_HELP3); + freep(arg); + return 1; + } + getPath(szDestPath, arg[destIndex]); + /* Make sure that destination exists */ + if(!IsExistingDirectory(szDestPath)) + { + LoadString(CMD_ModuleHandle, STRING_REPLACE_ERROR2, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, szDestPath); + ConOutResPaging(TRUE,STRING_REPLACE_HELP3); + freep(arg); + return 1; + } + } + } + else + { + /* Dest is current dir */ + GetCurrentDirectory(MAX_PATH,szDestPath); + } + + /* Get the full source path */ + if(!(_tcslen(arg[srcIndex]) == 2 && arg[srcIndex][1] == ':')) + getPath(szSrcPath, arg[srcIndex]); + else + _tcscpy(szSrcPath,arg[srcIndex]); + + /* Source does not have wildcards */ + if (_tcschr (arg[srcIndex], _T('*')) == NULL && + _tcschr (arg[srcIndex], _T('?')) == NULL) + { + /* Check so that source is not a directory, because that is not allowed */ + if(IsExistingDirectory(szSrcPath)) + { + LoadString(CMD_ModuleHandle, STRING_REPLACE_ERROR6, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, szSrcPath); + ConOutResPaging(TRUE,STRING_REPLACE_HELP3); + freep(arg); + return 1; + } + /* Check if the file exists */ + if(!IsExistingFile(szSrcPath)) + { + ConOutResPaging(TRUE,STRING_REPLACE_HELP3); + freep(arg); + return 1; + } + } + /* /w switch is set so wait for any key to be pressed */ + if(dwFlags & REPLACE_DISK) + { + msg_pause(); + cgetchar(); + } + + /* Add an extra \ to the destination path if needed */ + if(szDestPath[_tcslen(szDestPath) - 1] != _T('\')) + _tcscat(szDestPath, _T("\")); + + /* Save source path */ + _tcscpy(tmpSrcPath,szSrcPath); + /* Replace in dest dir */ + filesReplaced += recReplace(dwFlags, tmpSrcPath, szDestPath, &doMore); + /* If subdir switch is set replace in the subdirs to */ + if(dwFlags & REPLACE_SUBDIR && doMore) + { + filesReplaced += recFindSubDirs(dwFlags, szSrcPath, szDestPath, &doMore); + } + + /* If source == dest write no more */ + if(filesReplaced != -1) + { + /* No files replaced */ + if(filesReplaced==0) + { + /* Add switch dependent output */ + if(dwFlags & REPLACE_ADD) + ConOutResPaging(TRUE,STRING_REPLACE_HELP7); + else + ConOutResPaging(TRUE,STRING_REPLACE_HELP3); + } + /* Some files replaced */ + else + { + /* Add switch dependent output */ + if(dwFlags & REPLACE_ADD) + LoadString(CMD_ModuleHandle, STRING_REPLACE_HELP8, szMsg, RC_STRING_MAX_SIZE); + else + LoadString(CMD_ModuleHandle, STRING_REPLACE_HELP4, szMsg, RC_STRING_MAX_SIZE); + ConOutPrintf(szMsg, filesReplaced); + } + } + /* Return memory */ + freep(arg); + return 1; +} +#endif /* INCLUDE_CMD_REPLACE */
Propchange: trunk/reactos/base/shell/cmd/replace.c ------------------------------------------------------------------------------ svn:eol-style = native
Propchange: trunk/reactos/base/shell/cmd/replace.c ------------------------------------------------------------------------------ svn:keywords = author date id revision
Modified: trunk/reactos/base/shell/cmd/resource.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/base/shell/cmd/resource.h?r... ============================================================================== --- trunk/reactos/base/shell/cmd/resource.h (original) +++ trunk/reactos/base/shell/cmd/resource.h Thu Sep 27 12:35:08 2007 @@ -63,8 +63,13 @@ #define STRING_TIME_ERROR1 348 #define STRING_TYPE_ERROR1 349 #define STRING_WINDOW_ERROR1 350 - - +#define STRING_REPLACE_ERROR1 351 +#define STRING_REPLACE_ERROR2 352 +#define STRING_REPLACE_ERROR3 353 +#define STRING_REPLACE_ERROR4 354 +#define STRING_REPLACE_ERROR5 355 +#define STRING_REPLACE_ERROR6 356 +#define STRING_REPLACE_ERROR7 357
#define STRING_ATTRIB_HELP 600 #define STRING_ALIAS_HELP 601 @@ -223,6 +228,18 @@ #define STRING_MD_ERROR 725 #define STRING_MD_ERROR2 726
+#define STRING_REPLACE_HELP1 727 +#define STRING_REPLACE_HELP2 728 +#define STRING_REPLACE_HELP3 729 +#define STRING_REPLACE_HELP4 730 +#define STRING_REPLACE_HELP5 731 +#define STRING_REPLACE_HELP6 732 +#define STRING_REPLACE_HELP7 733 +#define STRING_REPLACE_HELP8 734 +#define STRING_REPLACE_HELP9 735 +#define STRING_REPLACE_HELP10 736 +#define STRING_REPLACE_HELP11 737 +
/* These strings are language independent (cmd.rc) */ #define STRING_FREEDOS_DEV 800