📄 del.c
字号:
/* * DEL.C - del internal command. * * * History: * * 06/29/98 (Rob Lake rlake@cs.mun.ca) * rewrote del to support wildcards * added my name to the contributors * * 07/13/98 (Rob Lake) * fixed bug that caused del not to delete file with out * attribute. moved set, del, ren, and ver to there own files * * 27-Jul-1998 (John P Price <linux-guru@gcfl.net>) * added config.h include * * 09-Dec-1998 (Eric Kohl <ekohl@abo.rhein-zeiung.de>) * Fixed command line parsing bugs. * * 21-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeiung.de>) * Started major rewrite using a new structure. * * 03-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeiung.de>) * First working version. * * 30-Mar-1999 (Eric Kohl <ekohl@abo.rhein-zeiung.de>) * Added quiet ("/Q"), wipe ("/W") and zap ("/Z") option. * * 06-Nov-1999 (Eric Kohl <ekohl@abo.rhein-zeiung.de>) * Little fix to keep DEL quiet inside batch files. */#include "config.h"#ifdef INCLUDE_CMD_DEL#include "cmd.h"enum{ DEL_ATTRIBUTES = 0x001, /* /A : not implemented */ DEL_ERROR = 0x002, /* /E : not implemented */ DEL_NOTHING = 0x004, /* /N */ DEL_PROMPT = 0x008, /* /P : not implemented */ DEL_QUIET = 0x010, /* /Q */ DEL_SUBDIR = 0x020, /* /S : not implemented */ DEL_TOTAL = 0x040, /* /T */ DEL_WIPE = 0x080, /* /W */ DEL_EMPTYDIR = 0x100, /* /X : not implemented */ DEL_YES = 0x200, /* /Y : not implemented */ DEL_ZAP = 0x400 /* /Z */};static BOOLRemoveFile (LPTSTR lpFileName, DWORD dwFlags){ if (dwFlags & DEL_WIPE) { /* FIXME: Wipe the given file */ } return DeleteFile (lpFileName);}INT CommandDelete (LPTSTR cmd, LPTSTR param){ TCHAR szFullPath[MAX_PATH]; LPTSTR pFilePart; LPTSTR *arg = NULL; INT args; INT i; INT nEvalArgs = 0; /* nunber of evaluated arguments */ DWORD dwFlags = 0; DWORD dwFiles = 0; HANDLE hFile; WIN32_FIND_DATA f; if (!_tcsncmp (param, _T("/?"), 2)) { ConOutPuts (_T("Deletes one or more files.\n" _T( "\n") _T("DEL [/N /P /T /Q /W /Z] file ...\n") _T("DELETE [/N /P /T /Q /W /Z] file ...\n") _T("ERASE [/N /P /T /Q /W /Z] file ...\n") _T("\n") _T(" file Specifies the file(s) to delete.\n") _T("\n") _T(" /N Nothing.\n") _T(" /P Prompts for confirmation before deleting each file.\n") _T(" (Not implemented yet!)\n") _T(" /T Display total number of deleted files and freed disk space.\n") _T(" /Q Quiet.\n") _T(" /W Wipe. Overwrite the file with zeros before deleting it.\n") _T(" /Z Zap (delete hidden, read-only and system files).\n"))); return 0; } arg = split (param, &args); if (args > 0) { /* check for options anywhere in command line */ for (i = 0; i < args; i++) { if (*arg[i] == _T('/')) { if (_tcslen (arg[i]) >= 2) { switch (_totupper (arg[i][1])) { case _T('N'): dwFlags |= DEL_NOTHING; break; case _T('P'): dwFlags |= DEL_PROMPT; break; case _T('Q'): dwFlags |= DEL_QUIET; break; case _T('S'): dwFlags |= DEL_SUBDIR; break; case _T('T'): dwFlags |= DEL_TOTAL; break; case _T('W'): dwFlags |= DEL_WIPE; break; case _T('Z'): dwFlags |= DEL_ZAP; break; } } nEvalArgs++; } } /* there are only options on the command line --> error!!! */ if (args == nEvalArgs) { error_req_param_missing (); freep (arg); return 1; } /* keep quiet within batch files */ if (bc != NULL) dwFlags |= DEL_QUIET; /* check for filenames anywhere in command line */ for (i = 0; i < args; i++) { if (!_tcscmp (arg[i], _T("*")) || !_tcscmp (arg[i], _T("*.*"))) { INT res; res = FilePromptYN (_T("All files in directory will be deleted!\n") _T("Are you sure (Y/N)?")); if ((res == PROMPT_NO) || (res == PROMPT_BREAK)) break; } if (*arg[i] != _T('/')) {#ifdef _DEBUG ConErrPrintf (_T("File: %s\n"), arg[i]);#endif if (_tcschr (arg[i], _T('*')) || _tcschr (arg[i], _T('?'))) { /* wildcards in filespec */#ifdef _DEBUG ConErrPrintf (_T("Wildcards!\n\n"));#endif GetFullPathName (arg[i], MAX_PATH, szFullPath, &pFilePart);#ifdef _DEBUG ConErrPrintf (_T("Full path: %s\n"), szFullPath); ConErrPrintf (_T("File part: %s\n"), pFilePart);#endif hFile = FindFirstFile (szFullPath, &f); if (hFile == INVALID_HANDLE_VALUE) { error_file_not_found (); freep (arg); return 0; } do { /* ignore "." and ".." */ if (!_tcscmp (f.cFileName, _T(".")) || !_tcscmp (f.cFileName, _T(".."))) continue; _tcscpy (pFilePart, f.cFileName);#ifdef _DEBUG ConErrPrintf (_T("Full filename: %s\n"), szFullPath);#endif if (!(dwFlags & DEL_QUIET) && !(dwFlags & DEL_TOTAL)) ConErrPrintf (_T("Deleting: %s\n"), szFullPath); /* delete the file */ if (!(dwFlags & DEL_NOTHING)) { if (RemoveFile (szFullPath, dwFlags)) { dwFiles++; } else { if (dwFlags & DEL_ZAP) { if (SetFileAttributes (szFullPath, 0)) { if (RemoveFile (szFullPath, dwFlags)) { dwFiles++; } else { ErrorMessage (GetLastError(), _T("")); } } else { ErrorMessage (GetLastError(), _T("")); } } else { ErrorMessage (GetLastError(), _T("")); } } } } while (FindNextFile (hFile, &f)); FindClose (hFile); } else { /* no wildcards in filespec */#ifdef _DEBUG ConErrPrintf (_T("No Wildcards!\n"));#endif GetFullPathName (arg[i], MAX_PATH, szFullPath, &pFilePart);#ifdef _DEBUG ConErrPrintf (_T("Full path: %s\n"), szFullPath);#endif if (!(dwFlags & DEL_QUIET) && !(dwFlags & DEL_TOTAL)) ConOutPrintf (_T("Deleting %s\n"), szFullPath); if (!(dwFlags & DEL_NOTHING)) { if (RemoveFile (szFullPath, dwFlags)) { dwFiles++; } else { if (dwFlags & DEL_ZAP) { if (SetFileAttributes (szFullPath, 0)) { if (RemoveFile (szFullPath, dwFlags)) { dwFiles++; } else { ErrorMessage (GetLastError(), _T("")); } } else { ErrorMessage (GetLastError(), _T("")); } } else { ErrorMessage (GetLastError(), _T("")); } } } } } } } else { /* only command given */ error_req_param_missing (); freep (arg); return 1; } freep (arg); if (!(dwFlags & DEL_QUIET)) { if (dwFiles == 0) ConOutPrintf (_T(" 0 files deleted\n")); else ConOutPrintf (_T(" %lu file%s deleted\n"), dwFiles, (dwFiles == 1) ? "" : "s"); } return 0;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -