Implemented /S and /Q in remove directory. Added a check for files in the folder. This fixes bug 742. Updated res file, translators please update sometime soon. Modified: trunk/reactos/subsys/system/cmd/En.rc Modified: trunk/reactos/subsys/system/cmd/internal.c Modified: trunk/reactos/subsys/system/cmd/resource.h _____
Modified: trunk/reactos/subsys/system/cmd/En.rc --- trunk/reactos/subsys/system/cmd/En.rc 2005-10-02 20:03:20 UTC (rev 18231) +++ trunk/reactos/subsys/system/cmd/En.rc 2005-10-02 20:17:59 UTC (rev 18232) @@ -364,7 +364,10 @@
STRING_REM_HELP, "Starts a comment line in a batch file.\n\nREM [Comment]"
STRING_RMDIR_HELP, "Removes a directory.\n\n\ -RMDIR [drive:]path\nRD [drive:]path" +RMDIR [drive:]path\nRD [drive:]path\n\ +/S Deletes all files and folders within target\n\ +/Q Doesnt prompt for user\n" +STRING_RMDIR_HELP2, "Directory is not empty!\n"
STRING_REN_HELP1, "Renames a file/directory or files/directories.\n\n\ RENAME [/E /N /P /Q /S /T] old_name ... new_name\n\ _____
Modified: trunk/reactos/subsys/system/cmd/internal.c --- trunk/reactos/subsys/system/cmd/internal.c 2005-10-02 20:03:20 UTC (rev 18231) +++ trunk/reactos/subsys/system/cmd/internal.c 2005-10-02 20:17:59 UTC (rev 18232) @@ -499,68 +499,163 @@
* RD / RMDIR * */ +BOOL DeleteFolder(LPTSTR FileName) +{ + TCHAR Base[MAX_PATH]; + TCHAR TempFileName[MAX_PATH]; + HANDLE hFile; + WIN32_FIND_DATA f; + _tcscpy(Base,FileName); + _tcscat(Base,_T("\*")); + hFile = FindFirstFile(Base, &f); + Base[_tcslen(Base) - 1] = _T('\0'); + if (hFile != INVALID_HANDLE_VALUE) + { + do + { + if (!_tcscmp(f.cFileName, _T(".")) || + !_tcscmp(f.cFileName, _T(".."))) + continue; + _tcscpy(TempFileName,Base); + _tcscat(TempFileName,f.cFileName); + + if(f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + DeleteFolder(TempFileName); + else + { + SetFileAttributes(TempFileName,FILE_ATTRIBUTE_NORMAL); + if(!DeleteFile(TempFileName)) + return 0; + } + + }while (FindNextFile (hFile, &f)); + FindClose (hFile); + } + return RemoveDirectory(FileName); +} INT cmd_rmdir (LPTSTR cmd, LPTSTR param) { LPTSTR dir; /* pointer to the directory to change to */ - LPTSTR place; /* used to search for the \ when no space is used */ - - LPTSTR *p = NULL; - INT argc; - + char ch; + INT args; + LPTSTR *arg = NULL; + INT i; + BOOL RD_SUB = FALSE; + BOOL RD_QUIET = FALSE; + HANDLE hFile; + WIN32_FIND_DATA f; + INT res; + TCHAR szMsg[RC_STRING_MAX_SIZE]; + TCHAR szFullPath[MAX_PATH]; + if (!_tcsncmp (param, _T("/?"), 2)) { ConOutResPaging(TRUE,STRING_RMDIR_HELP); return 0; }
- /* check if there is no space between the command and the path */ - if (param[0] == _T('\0')) + nErrorLevel = 0; + + arg = split (param, &args, FALSE); + + if (args == 0) { - /* search for the \ or . so that both short & long names will work */ - for (place = cmd; *place; place++) - if (*place == _T('.') || *place == _T('\')) - break; + /* only command given */ + error_req_param_missing (); + freep (arg); + return 1; + }
- if (*place) - dir = place; - else - /* signal that there are no parameters */ - dir = NULL; - } - else + /* check for options anywhere in command line */ + for (i = 0; i < args; i++) { - p = split (param, &argc, FALSE); - if (argc > 1) + if (*arg[i] == _T('/')) { - /*JPP 20-Jul-1998 use standard error message */ - error_too_many_parameters (param); - freep (p); - return 1; + /*found a command, but check to make sure it has something after it*/ + if (_tcslen (arg[i]) == 2) + { + ch = _totupper (arg[i][1]); + if (ch == _T('S')) + { + RD_SUB = TRUE; + } + else if (ch == _T('Q')) + { + RD_QUIET = TRUE; + } + } } else - dir = p[0]; + { + /* get the folder name */ + _tcscpy(dir,arg[i]); + } } - + if (!dir) { + /* No folder to remove */ ConErrResPuts(STRING_ERROR_REQ_PARAM_MISSING); + freep(arg); return 1; }
+ GetFullPathName(dir,MAX_PATH,szFullPath,NULL); /* remove trailing \ if any, but ONLY if dir is not the root dir */ - if (_tcslen (dir) >= 2 && dir[_tcslen (dir) - 1] == _T('\')) - dir[_tcslen(dir) - 1] = _T('\0'); + if (_tcslen (szFullPath) >= 2 && szFullPath[_tcslen (szFullPath) - 1] == _T('\')) + szFullPath[_tcslen(szFullPath) - 1] = _T('\0');
- if (!RemoveDirectory (dir)) + if(RD_SUB) { + /* ask if they want to delete evrything in the folder */ + if (!RD_QUIET) + { + LoadString( CMD_ModuleHandle, STRING_DEL_HELP2, szMsg, RC_STRING_MAX_SIZE); + res = FilePromptYNA (szMsg); + if ((res == PROMPT_NO) || (res == PROMPT_BREAK)) + { + freep(arg); + nErrorLevel = 1; + return 1; + } + } + + } + else + { + /* check for files in the folder */ + _tcscat(szFullPath,_T("\*")); + + hFile = FindFirstFile(szFullPath, &f); + if (hFile != INVALID_HANDLE_VALUE) + { + do + { + if (!_tcscmp(f.cFileName,_T(".")) || + !_tcscmp(f.cFileName,_T(".."))) + continue; + ConOutResPuts(STRING_RMDIR_HELP2); + freep(arg); + FindClose (hFile); + nErrorLevel = 1; + return 1; + }while (FindNextFile (hFile, &f)); + FindClose (hFile); + } + /* reovme the \* */ + szFullPath[_tcslen(szFullPath) - 2] = _T('\0'); + } + + if (!DeleteFolder(szFullPath)) + { + /* Couldnt delete the folder, clean up and print out the error */ ErrorMessage (GetLastError(), _T("RD")); - freep (p); - + freep (arg); + nErrorLevel = 1; return 1; }
- freep (p); - + freep (arg); return 0; } #endif _____
Modified: trunk/reactos/subsys/system/cmd/resource.h --- trunk/reactos/subsys/system/cmd/resource.h 2005-10-02 20:03:20 UTC (rev 18231) +++ trunk/reactos/subsys/system/cmd/resource.h 2005-10-02 20:17:59 UTC (rev 18232) @@ -219,7 +219,9 @@
#define STRING_EXPECTED_CLOSE_PAREN 721 #define STRING_EXPECTED_NUMBER_OR_VARIABLE 722 #define STRING_SYNTAX_COMMAND_INCORRECT 723 +#define STRING_RMDIR_HELP2 724
+ /* These strings are language independent (cmd.rc) */ #define STRING_FREEDOS_DEV 800 #define STRING_REACTOS_DEV 801