Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除以子字符串开头的文件_C++_Winapi - Fatal编程技术网

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的四个文件的简单示例