C++ 删除以子字符串开头的文件
我想删除所有以子字符串开头的文件C++ 删除以子字符串开头的文件,c++,winapi,C++,Winapi,我想删除所有以子字符串开头的文件 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
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检查错误时,我得到错误\u无效\u名称
知道如何解决这个问题吗?
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);
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);
尽管您可以搜索文件名,然后分别为每个文件名调用DeleteFile
,但我的建议是使用一个Windows shell函数来执行此任务
例如,您可以使用如下代码:
#define _WIN32_IE 0x500
#include <windows.h>
#include <shellapi.h>
#include <shlobj.h>
#include <iostream>
#include <string>
static char const *full_path(std::string const &p) {
static char path[MAX_PATH+2] = {0};
char *ignore;
GetFullPathName(p.c_str(), sizeof(path), path, &ignore);
return path;
}
static int shell_delete(std::string const &name) {
SHFILEOPSTRUCT op = { 0 };
op.wFunc = FO_DELETE;
op.pFrom = full_path(name);
op.fFlags = FOF_ALLOWUNDO | FOF_SILENT | FOF_WANTNUKEWARNING | FOF_NOCONFIRMATION;
return !SHFileOperation(&op);
}
int main(int argc, char **argv) {
if ( argc < 2) {
fprintf(stderr, "Usage: delete <filename> [filename ...]");
return 1;
}
for (int i=1; i<argc; i++)
shell_delete(argv[i]);
}
#定义_WIN32_IE 0x500
#包括
#包括
#包括
#包括
#包括
静态字符常量*完整路径(标准::字符串常量&p){
静态字符路径[MAX_path+2]={0};
字符*忽略;
GetFullPathName(p.c_str()、sizeof(path)、path和ignore);
返回路径;
}
静态int shell_delete(std::string const&name){
SHFILEOPSTRUCT op={0};
op.wFunc=FO_DELETE;
op.pFrom=完整路径(名称);
op.fFlags=FOF|u ALLOWUNDO | FOF|u SILENT | FOF|u WANTNUKEWARNING | FOF|u NOCONFIRMATION;
return!SHFileOperation(&op);
}
int main(int argc,字符**argv){
如果(argc<2){
fprintf(stderr,“用法:删除[文件名…]”);
返回1;
}
for(int i=1;i.IFileOperation
是一个COM接口,因此除非您在代码中的其他地方使用COM,否则使用它将为(至少在这种情况下)增加相当多的额外工作的可能性非常大很少或没有真正的优势。特别是您已经在使用COM,但是,这可能值得考虑。虽然您可以搜索文件名,然后分别调用DeleteFile
,但我的建议是使用一个Windows shell函数来完成这项工作
例如,您可以使用如下代码:
#define _WIN32_IE 0x500
#include <windows.h>
#include <shellapi.h>
#include <shlobj.h>
#include <iostream>
#include <string>
static char const *full_path(std::string const &p) {
static char path[MAX_PATH+2] = {0};
char *ignore;
GetFullPathName(p.c_str(), sizeof(path), path, &ignore);
return path;
}
static int shell_delete(std::string const &name) {
SHFILEOPSTRUCT op = { 0 };
op.wFunc = FO_DELETE;
op.pFrom = full_path(name);
op.fFlags = FOF_ALLOWUNDO | FOF_SILENT | FOF_WANTNUKEWARNING | FOF_NOCONFIRMATION;
return !SHFileOperation(&op);
}
int main(int argc, char **argv) {
if ( argc < 2) {
fprintf(stderr, "Usage: delete <filename> [filename ...]");
return 1;
}
for (int i=1; i<argc; i++)
shell_delete(argv[i]);
}
#定义_WIN32_IE 0x500
#包括
#包括
#包括
#包括
#包括
静态字符常量*完整路径(标准::字符串常量&p){
静态字符路径[MAX_path+2]={0};
字符*忽略;
GetFullPathName(p.c_str()、sizeof(path)、path和ignore);
返回路径;
}
静态int shell_delete(std::string const&name){
SHFILEOPSTRUCT op={0};
op.wFunc=FO_DELETE;
op.pFrom=完整路径(名称);
op.fFlags=FOF|u ALLOWUNDO | FOF|u SILENT | FOF|u WANTNUKEWARNING | FOF|u NOCONFIRMATION;
return!SHFileOperation(&op);
}
int main(int argc,字符**argv){
如果(argc<2){
fprintf(stderr,“用法:删除[文件名…]”);
返回1;
}
for(int i=1;i.IFileOperation
是一个COM接口,因此除非您在代码中的其他地方使用COM,否则使用它将为(至少在这种情况下)增加相当多的额外工作的可能性非常大很少或没有真正的优势。特别是您已经在使用COM,但是,这可能值得考虑。该函数不使用通配符。您必须自己处理文件。您可以执行系统(“del C:\\logs\\test\\test\u 12-12-2018\u 1*”)
@PaulSanders一个非常丑陋的解决方案。@Jabberwocky为什么?@PaulSanders因为正确的方法是按照公认的答案去做。如果我继续你的推理,为什么不使用系统(“echo Hello world”);
而不是printf(“Hello world”)
。函数不带通配符。你必须自己处理文件。你可以做系统(“delc:\\logs\\test\\test\u 12-12-2018\u 1*”;
@PaulSanders一个非常丑陋的解决方案。@Jabberwocky为什么?@PaulSanders,因为正确的方法是按照公认的答案来做。如果我继续你的推理,为什么不使用系统(“echo Hello world”);
而不是printf(“Hello world”);
。但是需要if(无效的句柄值!=hFind)
最好使用FindFirstFileExW
和FindExInfoBasic
@RbMm添加的无效句柄值
检查,但是,我认为这么简单的操作不需要-EX
变量(OP表示有意删除单个目录中的某些文件,而不是目录树的下一级)只需FindFirstFileExW
使用FIND_FIRST\u EX_LARGE_FETCH
和FindExInfoBasic
即可显著提高性能,我们是否需要遍历目录tree@RbMm将该信息作为选项添加到我的帖子中(不在主代码中),因为我觉得优化不会真正受益于OP的四个文件的简单示例,但是需要if(无效的\u句柄\u值!=hFind)
最好使用FindFirstFileExW
和FindExInfoBasic
@RbMm添加的无效句柄值
检查,但是,我认为这么简单的操作不需要-EX
变量(OP表示有意删除单个目录中的某些文件,而不是目录树的下一级)只需FindFirstFileExW
使用FIND_FIRST\u EX_LARGE_FETCH
和FindExInfoBasic
即可显著提高性能,我们是否需要遍历目录tree@RbMm将该信息作为选项添加到我的帖子中(不在主代码中),因为我觉得优化不会真正有利于OP的四个文件的简单示例