清泛IT社区

标题: vc/mfc *通配符 批量删除文件 [打印本页]

作者: 清泛网    时间: 2016-02-26 15:59
标题: vc/mfc *通配符 批量删除文件
直接上代码,可直接运行亲测有效,使用SHFileOperation函数:
  1. #include "stdafx.h"
  2. #include <windows.h>

  3. int _tmain(int argc, _TCHAR* argv[])
  4. {
  5.         LPTSTR delFileName = L"c:/test/test*.txt";

  6.         SHFILEOPSTRUCT FileOp;
  7.         ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT));

  8.         FileOp.fFlags = FOF_NO_UI;
  9.         FileOp.wFunc = FO_DELETE;
  10.         FileOp.pFrom = delFileName;
  11.         FileOp.pTo = NULL;

  12.         if (SHFileOperation(&FileOp) != 0)
  13.                 printf("删除文件:%S失败(Error:%d)\n", delFileName, GetLastError());

  14.         return 0;
  15. }
复制代码
经过测试,文件路径必须为绝对路径,相对路径会操作失败。
获取当前路径拼上相对路径代码如下:
  1. char szDelPath[MAX_PATH + 1] = { 0 };
  2. GetCurrentDirectory(MAX_PATH, szDelPath);
  3. CString delFileName;
  4. delFileName.Format("%s\\test_*.xml", szDelPath);
复制代码


--------------------------------------------
补充:
不过SHFileOperation方法有时不起作用,用起来结果飘忽不定,详见:http://bbs.csdn.net/topics/390691058
路径末尾加上'\0'也一样,笔者亲测,删除有时成功有时失败。

改用C++的FindNextFile,支持 * 通配符查找文件,核心代码如下:
  1. WIN32_FIND_DATA FindFileData;
  2. char szCurPath[MAX_PATH + 1] = { 0 };
  3. GetCurrentDirectory(MAX_PATH, szCurPath);
  4. CString findFileName;
  5. findFileName.Format("%stest*.txt", szCurPath);

  6. HANDLE hFind = ::FindFirstFile(findFileName, &FindFileData);
  7. if(INVALID_HANDLE_VALUE != hFind)
  8. {
  9.        do {                        
  10.              findFileName.Format("%s%s", szCurPath, FindFileData.cFileName);
  11.              DeleteFile(findFileName);
  12.        } while(FindNextFile(hFind, &FindFileData));

  13.        FindClose(hFind);
  14. }
复制代码






欢迎光临 清泛IT社区 (https://bbs.tsingfun.com/) Powered by Discuz! X3.3