我想删除所有以子字符串开头的文件。
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);
请注意,
PathCchCombine
,FindFirstFileW
和DeleteFileW
都可能失败,而健壮的代码将检查其返回值并适当地处理失败。同样,如果FindNextFileW
返回0,而最后一个错误代码不是ERROR_NO_MORE_FILES
,则它由于实际错误(不是因为没有剩余可找的东西)而失败,因此也需要进行处理。另外,如果您关心速度(您的帖子中关于删除同一目录中的四个文件的示例似乎不需要它),请用以下内容替换行
hFind = FindFirstFileW(...)
:hFind = FindFirstFileExW(wszPattern, FindExInfoBasic, (LPVOID)&wfd, FindExSearchNameMatch, NULL, FIND_FIRST_EX_LARGE_FETCH);