#pragma once#include <string>
#include <vector>
#include <algorithm>// SHFileOperation
#include <Shlwapi.h>
#pragma comment (lib,"Shlwapi.lib")// iFileType,0:文件夹,1:文件
//void PrintFold(int iCurrentLevel, int iFileType, std::string strPath, std::string strFileName)
//{
//  if (iFileType == 0)
//  {
//      printf(_T("文件夹:%d: %s\\%s\n"), iCurrentLevel, strPath.c_str(), strFileName.c_str());
//  }
//  else
//  {
//      printf(_T("文件:%d: %s\\%s\n"), iCurrentLevel, strPath.c_str(), strFileName.c_str());
//  }
//}// strPath的格式为c:/ss/ww
// iCurrentLevel:当前文件层级,0开始
// uiEndLevel:遍历层级深度,-1为遍历所有层级, 比如为0时只遍历当前目录
template<class TTraverseProcess>
bool TraverseFold(std::wstring strPath, TTraverseProcess& TP, std::wstring strWildcard = _T("\\*.*"), unsigned int uiEndLevel = -1, unsigned int iCurrentLevel = 0)
{if (iCurrentLevel > uiEndLevel){// 到达遍历指定深度return true;}WIN32_FIND_DATA findFileData;std::wstring strFindPath = strPath + strWildcard;    //这里一定要指明通配符,不然不会读取所有文件和目录HANDLE hFind = ::FindFirstFile(strFindPath.c_str(), &findFileData);if (INVALID_HANDLE_VALUE == hFind) {return false;}//遍历文件夹do{std::wstring strFileName = findFileData.cFileName;if (strFileName != L"." && strFileName != L".."){//不是当前路径或者父目录的快捷方式//printf(_T("%d: %s\\%s\n"), iCurrentLevel, strPath.c_str(), strFileName.c_str());if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){//是一个普通目录//设置下一个将要扫描的文件夹路径strFindPath = strPath + std::wstring(L"\\") + strFileName;//遍历该目录TraverseFold(strFindPath, TP, strWildcard, uiEndLevel, iCurrentLevel + 1);// 处理函数对象TP(iCurrentLevel, 0, strPath, strFileName);}else{//是一个文件TP(iCurrentLevel, 1, strPath, strFileName);}}} while (::FindNextFile(hFind, &findFileData));//寻找下一个目录或者文件::FindClose(hFind);return true;
}// 删除文件夹
bool KDeleteDirectory(std::wstring strDelDir, std::wstring& strErr)
{class FindAllFiles{public:void operator()(int iCurrentLevel, int iFileType, std::wstring strPath, std::wstring strFileName){if (iFileType == 0){//wprintf_s(L"文件夹:%d: %s\\%s\n", iCurrentLevel, strPath.c_str(), strFileName.c_str());strFoldPathVec.push_back(std::pair<int, std::wstring>(iCurrentLevel, strPath + L"\\" + strFileName));}else{//wprintf_s(L"文件:%d: %s\\%s\n", iCurrentLevel, strPath.c_str(), strFileName.c_str());strFilePathVec.push_back(strPath + L"\\" + strFileName);}}public:std::vector<std::wstring> strFilePathVec;std::vector<std::pair<int, std::wstring>> strFoldPathVec;};//遍历所有考试文件夹,获取考试文件夹FindAllFiles allFiles;TraverseFold(strDelDir, allFiles, L"\\*.*");for (size_t i = 0; i < allFiles.strFilePathVec.size(); ++i){if (!::DeleteFile(allFiles.strFilePathVec[i].c_str())){strErr = std::wstring(L"删除文件失败,") + allFiles.strFilePathVec[i];return false;}}std::sort(allFiles.strFoldPathVec.begin(), allFiles.strFoldPathVec.end(), [](std::pair<int, std::wstring>& lt, std::pair<int, std::wstring>& rt) {return lt.first > rt.first;});for (size_t i = 0; i < allFiles.strFoldPathVec.size(); ++i){if (!::RemoveDirectory(allFiles.strFoldPathVec[i].second.c_str())){strErr = std::wstring(L"删除文件夹失败,") + allFiles.strFoldPathVec[i].second;return false;}}if (!::RemoveDirectory(strDelDir.c_str())){strErr = std::wstring(L"删除文件夹失败,") + strDelDir;return false;}return true;
}bool KDeleteDirectorySH(std::wstring strDelDir, std::wstring& strErr)
{SHFILEOPSTRUCTW FileOp;FileOp.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT;// | FOF_ALLOWUNDO/*删除到回收站*/FileOp.hNameMappings = NULL;FileOp.hwnd = NULL;FileOp.lpszProgressTitle = NULL;strDelDir.push_back('\0');FileOp.pFrom = strDelDir.c_str();FileOp.pTo = NULL;FileOp.wFunc = FO_DELETE;int iReturn = SHFileOperationW(&FileOp);if (0 != iReturn){strErr = std::wstring(L"删除文件夹失败,") + strDelDir;return false;}return true;
}

既然有SHFileOperation,为什么要自己遍历文件夹呢,因为在实际使用中发现SHFileOperation非常耗时,自己遍历文件夹删除完大概只要几十毫秒,SHFileOperation则需要1秒多,很无语的,在删除大量文件夹时就会觉得进度很慢

C++ Win32 删除文件夹(非空)相关推荐

  1. php函数删除非空目录,删除文件夹(非空目录)及其中所有文件的思路及源代码

    在MFC中没有提供API函数删除非空文件夹 A(目录),所以要想删除一个非空文件夹(目录)必须先删除里面的文件. 这里需要注意一个问题,如果非空文件夹(目录)下还有文件夹(目录)AA: 1.如果文件夹 ...

  2. python 删除文件夹、删除非空文件夹

    一般删除文件时使用os库,然后利用os.remove(path)即可完成删除,如果删除空文件夹则可使用os.removedirs(path)即可,  但是如果需要删除整个文件夹,且文件夹非空时使用os ...

  3. Python操作FTP服务器实现文件和文件夹的上传与下载,python清理ftp目录下的所有文件和非空文件夹

    Python 连接 FTP 服务器并实现文件夹上传实例演示 第一章:连接 FTP 服务器并实现文件夹上传 ① 连接 FTP 服务器 ② 区分文件和文件夹名 ③ 文件夹名包含空格处理 ④ 使用递归实现: ...

  4. linux 删除文件_Linux删除文件夹命令有哪些

    今天要和大家分享的Linux常用命令是Linux删除文件夹命令,Linux删除文件夹很简单,常用的命令有rmdir和rm,以下分别介绍一下,大家根据情况选择使用即可. Linux删除文件夹命令有哪些 ...

  5. 【python】os模块 递归删除文件夹所有文件 --笔记

    ''' os.environ 获取系统的环境变量 os.name nt -- windows \r\n | posix --- Linux \nos.path:''' import osprint(o ...

  6. linux 删除中文文件夹,Linux删除文件夹命令是什么

    Linux删除文件夹命令有:1.rmdir命令,用于删除空的文件夹,语法格式"rmdir [-p] 文件夹名称":2.rm命令,用于删除一个文件或者文件夹,语法格式"rm ...

  7. python删除文件夹命令_linux删除文件夹(命令详解)

    linux删除文件夹 Linux删除文件,文件夹主要用的命令是rm,下面将对linuxrm命令做一个简单的介绍. 语法: rm[选项]DirName 该命令中的[选项]常用的有以下几种: -i删除前逐 ...

  8. SylixOS下无法删除文件夹

    SylixOS下删除文件命令为rm,删除文件夹命令为rmdir.SylixOS下命令名称及功能和Unix/Linux下类似,但SylixOS自带命令功能较少,很多选项不具备. rmdir命令只能删除空 ...

  9. dos命令删除文件夹和文件的方法

    在dos命令删除文件夹或文件,先要确定文件夹或文件是否有特殊的属性,比如"系统"."只读"."隐藏",如果有,去掉这些属性,命令如下 文件夹 ...

最新文章

  1. 迁移学习:如何为您的机器学习问题选择正确的预训练模型
  2. 全国大学生智能车单车行进组中的单车改造飞轮安装方案参考
  3. 数组去重--这几种方法够不?
  4. 使用ip6tables禁用ipv6
  5. Java 8 新日期时间 API ( 上 ) – 本地日期时间
  6. HDU Fibonacci
  7. 网上免费打电话和国际长途
  8. 如何快速开通流量主,提升小程序UV访客
  9. web端--斗图Tenor api 接入
  10. PIXI 宝物猎人(7)
  11. ghost服务器系统镜像文件,带RAID服务器能GHOST备份吗?
  12. Debian Cacti(仙人掌)
  13. c语言提纲,C语言复习提纲
  14. SQL Server LocalDB本地文件数据库操作实践
  15. Java SE 6 新特性: 对脚本语言的支持 [VERY GOOD]
  16. 【Linux网络安全】Linux操作系统安全配置(超全超详细)
  17. 一文读懂游戏引擎:核心问题、适用场景与下一个十年
  18. 奔驰老款C200语言设置,【图】奔驰C级隐藏功能设定大全
  19. 梦幻模拟战 java,梦幻模拟战手游:抽SSR真的难!你抽到几个SSR英雄?
  20. Go:Aho-Corasick自动机算法(附完整源码)

热门文章

  1. java抓取qq消息_Java代码---实现爬取腾讯新闻
  2. substance的使用示例(转)
  3. php 大数相加,吉首大学第九届"新星杯"大学生程序设计大赛(示例代码)
  4. 同步传输与异步传输的区别
  5. 量子计算机中证网,电子行业:全球首款纯硅量子计算机芯片诞生
  6. 从起源到再生:古代与中世纪哲学笔记
  7. 免费在线文件转换器Convertio
  8. 网络安全系列-十八: OSI七层模型详解
  9. transformer与视觉
  10. Oracle账号分享(供jdk下载使用)