我想删除所有以子字符串开头的文件。

  CString Formatter = _T("C:\\logs\\test\\test_12-12-2018_1*.*");
  DeleteFile(Formatter);


我打算使用上述代码删除以下文件

    C:\logs\test\test_12-12-2018_1_G1.txt
    C:\logs\test\test_12-12-2018_1_G2.txt
    C:\logs\test\test_12-12-2018_1_G3.txt
    C:\logs\test\test_12-12-2018_1_G4.txt


当我从GetLastError检查错误时,我得到ERROR_INVALID_NAME。

任何想法如何解决这个问题?

最佳答案

DeleteFile不使用通配符。看来您需要一个FindFirstFile / FindNextFile / FindClose循环,以将通配符转换为完整文件名列表。

#include <windows.h>
#include <pathcch.h>
#pragma comment(lib, "pathcch.lib")

// (In a function now)
WIN32_FIND_DATAW wfd;
WCHAR wszPattern[MAX_PATH];
HANDLE hFind;
INT nDeleted = 0;
PathCchCombine(wszPattern, MAX_PATH, L"C:\\Logs\\Test", L"test_12-12-2018_1*.*");
SetCurrentDirectoryW(L"C:\\Logs\\Test");

hFind = FindFirstFileW(wszPattern, &wfd);
if(hFind == INVALID_HANDLE_VALUE)
{
    // Handle error & exit
}
do
{
    DeleteFileW(wfd.cFileName);
    nDeleted++;
}
while (FindNextFileW(hFind, &wfd));
FindClose(hFind);

wprintf(L"Deleted %d files.\n", nDeleted);


请注意,PathCchCombineFindFirstFileWDeleteFileW都可能失败,而健壮的代码将检查其返回值并适当地处理失败。同样,如果FindNextFileW返回0,而最后一个错误代码不是ERROR_NO_MORE_FILES,则它由于实际错误(不是因为没有剩余可找的东西)而失败,因此也需要进行处理。

另外,如果您关心速度(您的帖子中关于删除同一目录中的四个文件的示例似乎不需要它),请用以下内容替换行hFind = FindFirstFileW(...)

hFind = FindFirstFileExW(wszPattern, FindExInfoBasic, (LPVOID)&wfd, FindExSearchNameMatch, NULL, FIND_FIRST_EX_LARGE_FETCH);

10-08 17:23