BOOL CDustman::EmptyDirectory( LPCTSTR szPath, BOOL bDeleteDesktopIni /*= FALSE*/, BOOL bWipeIndexDat /*= FALSE*/ ) { WIN32_FIND_DATA wfd; HANDLE hFind; CString sFullPath; CString sFindFilter; DWORD dwAttributes = 0; sFindFilter = szPath; sFindFilter += _T("\\*.*"); if ((hFind = FindFirstFile(sFindFilter, &wfd)) == INVALID_HANDLE_VALUE) { return FALSE; } do { if (_tcscmp(wfd.cFileName, _T(".")) == 0 || _tcscmp(wfd.cFileName, _T("..")) == 0 || (bDeleteDesktopIni == FALSE && _tcsicmp(wfd.cFileName, _T("desktop.ini")) == 0)) { continue; } sFullPath = szPath; sFullPath += _T('\\'); sFullPath += wfd.cFileName; //去掉只读属性 dwAttributes = GetFileAttributes(sFullPath); if (dwAttributes & FILE_ATTRIBUTE_READONLY) { dwAttributes &= ~FILE_ATTRIBUTE_READONLY; SetFileAttributes(sFullPath, dwAttributes); } if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { EmptyDirectory(sFullPath, bDeleteDesktopIni, bWipeIndexDat); RemoveDirectory(sFullPath); } else { if (bWipeIndexDat && _tcsicmp(wfd.cFileName, _T("index.dat")) == 0) { WipeFile(szPath, wfd.cFileName); } DeleteFile(sFullPath); } } while (FindNextFile(hFind, &wfd)); FindClose(hFind); return TRUE; }
int ShellRemoveFile(const wchar_t *Name,int Wipe) { ProcessedItems++; string strFullName; ConvertNameToFull(Name, strFullName); int MsgCode=0; for (;;) { if (Wipe) { if (SkipWipeMode!=-1) { MsgCode=SkipWipeMode; } else if (GetNumberOfLinks(strFullName)>1) { /* Файл "имя файла" Файл имеет несколько жестких ссылок. Уничтожение файла приведет к обнулению всех ссылающихся на него файлов. Уничтожать файл? */ MsgCode=Message(MSG_WARNING,5,MSG(MError),strFullName, MSG(MDeleteHardLink1),MSG(MDeleteHardLink2),MSG(MDeleteHardLink3), MSG(MDeleteFileWipe),MSG(MDeleteFileAll),MSG(MDeleteFileSkip),MSG(MDeleteFileSkipAll),MSG(MDeleteCancel)); } switch (MsgCode) { case -1: case -2: case 4: return DELETE_CANCEL; case 3: SkipWipeMode=2; case 2: return DELETE_SKIP; case 1: SkipWipeMode=0; case 0: if (WipeFile(Name)) return DELETE_SUCCESS; } } else if (!Opt.DeleteToRecycleBin) { /* HANDLE hDelete=FAR_CreateFile(Name,GENERIC_WRITE,0,nullptr,OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE|FILE_FLAG_POSIX_SEMANTICS,nullptr); if (hDelete!=INVALID_HANDLE_VALUE && CloseHandle(hDelete)) break; */ if (apiDeleteFile(Name)) break; } else if (RemoveToRecycleBin(Name)) break; if (SkipMode!=-1) MsgCode=SkipMode; else { MsgCode=Message(MSG_WARNING|MSG_ERRORTYPE,4,MSG(MError), MSG(MCannotDeleteFile),Name,MSG(MDeleteRetry), MSG(MDeleteSkip),MSG(MDeleteFileSkipAll),MSG(MDeleteCancel)); } switch (MsgCode) { case -1: case -2: case 3: return DELETE_CANCEL; case 2: SkipMode=1; case 1: return DELETE_SKIP; } } return DELETE_SUCCESS; }