C++删除目录,包括该目录下所有子目录和文件

article/2025/9/23 6:31:24

 

目录

一、FindFirstFile

1.函数功能:

2.函数原型:

3.参数:

4.返回值:

5.注意:

二、FindNextFile

1.函数功能:

2.函数原型:

3.参数:

4.返回值:

5.注意:

三、遍历指定目录下的所有文件和子目录

1.查看指定目录中的所有直接文件和目录

2.过滤.和..

3.使用递归遍历指定目录下的所有文件(包括子目录中的文件)和目录(包括子目录中的目录)

四、删除目录,包括该目录下所有子目录和文件

1.使用 FindFirstFile和FindNextFile

2.使用SHFileOperation


本文中的代码用的是Unicode字符集,所以参数需要用宽字符

一、FindFirstFile

1.函数功能:

   在目录中搜索与指定名称(如果使用通配符则为部分名称)相匹配的文件或子目录

2.函数原型:

HANDLE FindFirstFileW(LPCWSTR            lpFileName,LPWIN32_FIND_DATAW lpFindFileData
);

3.参数:

lpFileName

  • 目录或路径,以及文件名。文件名可以包含通配符,例如,星号(*)或问号(?).
  • 此参数不能为NULL,无效字符串(例如,空字符串或者缺少结束符'\0'的字符串),或者以反斜杠(\)结尾

lpFindFileData

  • 指向结构体WIN32_FIND_DATA的指针,该结构体用来接收找到的文件或者目录的信息

4.返回值:

  • 如果函数成功,则返回值将在随后的FindNextFile 或FindClose函数调用中使用的搜索句柄,并且lpFindFileData 参数包含找到的第一个文件或目录的信息。
  • 如果函数失败或者无法从lpFileName参数的搜索字符串中找到文件,则返回值为INVALID_HANDLE_VALUE ,并且lpFindFileData的内容不确定。
  • 如果该函数由于找不到匹配的文件而失败,则GetLastError 函数将返回ERROR_FILE_NOT_FOUND。

5.注意:

FindFirstFile函数打开一个搜索句柄,并返回文件系统通过和指定的模式匹配的名字找到的第一个文件的信息。当使用相同的文件名字符串模式时,这可能是也可能不是出现在目录列表应用程序(例如dir命令)中的的第一个目录,因为FindFirstFile部队搜索结果进行排序。

以下列表为一些其他的搜索特点:

  • 搜索仅在文件名上执行,而不在日期或者文件类型之类的其他属性上执行(有关其他选项,请参见FindFirstFileEx)
  • 为lpFileName 参数传递无效的字符串,NULL,或者空字符串不是该函数的有效用法。在这种情况下结果是不确定的。

建立搜索句柄后,可以使用FindNextFile函数来搜索与同样模式匹配的其他文件

当不再需要搜索句柄时,请使用FindClose函数(而不是CloseHandle)将其关闭。

如前所述,不能在输入参数lpFileName 字符串末尾使用反斜杠\,因此如何搜索根目录可能并不明显。如果要查看文件或者获取根目录的属性,则可以使用以下选项:

  • 要检查目录中的文件,可以使用"C:\*",并使用FindNextFile逐步浏览目录。

 


二、FindNextFile

1.函数功能:

从前面对函数FindFirstFile, FindFirstFileEx, 或者FindFirstFileTransacted的调用后,继续文件搜索。

2.函数原型:

BOOL FindNextFileW(HANDLE             hFindFile,LPWIN32_FIND_DATAW lpFindFileData
);

3.参数:

hFindFile

从前面对函数FindFirstFile或FindFirstFileEx的调用返回的搜索句柄。

lpFindFileData

指向结构体WIN32_FIND_DATA的指针,该结构体用来接收找到的文件或者子目录的信息

4.返回值:

  • 如果函数成功,则返回值为非0,并且参数lpFindFileData包含找到的下一个文件或目录的信息。
  • 如果函数失败,则返回值为0,并且lpFindFileData的内容不确定。若要获取更多的错误信息,请调用GetLastError函数。
  • 如果该函数由于找不到更多匹配文件而失败,则GetLastError函数将返回ERROR_NO_MORE_FILES。

5.注意:

该函数使用的搜索过滤器,和用来创建搜索句柄的过滤器相同。搜索句柄是通过参数hFindFile传过来的。


三、遍历指定目录下的所有文件和子目录

  • 要查看H:\miniprogram目录中的所有直接文件和目录,应该使用H:\miniprogram\*,而不是H:\miniprogram或H:\miniprogram\
  • 需要使用转义字符H:\\miniprogram\\*
  • FindFirstFile() 返回HANDLE类型,为下一次搜索提供搜索句柄。当搜索失败时,返回INVALID_HANDLE_VALUE
  • FindNextFile() ,用于搜索下一个文件,当不存在下一个文件,即搜索完毕后,返回0
  • 通常,最初的两次搜索得到的文件名为:"." 、"..",分别代表当前目录和上级目录

1.查看指定目录中的所有直接文件和目录

#include <windows.h>
#include <string>
#include <iostream>
using namespace std;void ListFilesInDirectory(wstring wstrDir)
{if (wstrDir.empty()){return;}HANDLE hFind;WIN32_FIND_DATA findData;wstring wstrTempDir = wstrDir + (L"\\*");hFind = FindFirstFile(wstrTempDir.c_str(), &findData);if (hFind == INVALID_HANDLE_VALUE){return;}do{wstring wstrFileName;wstrFileName.assign(wstrDir);wstrFileName.append(L"\\");wstrFileName.append(findData.cFileName);wcout << wstrFileName << endl;} while (FindNextFile(hFind, &findData)!= 0);FindClose(hFind);
}int main()
{	ListFilesInDirectory(L"H:\\miniprogram"); return 0;
}

目录内容如下:

程序输出如下:


得到文件夹中所有以.json结尾的文件

wstring wstrTempDir = wstrDir + (L"\\*.json");

2.过滤.和..

#include <windows.h>
#include <string>
#include <iostream>
using namespace std;void ListFilesInDirectory(wstring wstrDir)
{if (wstrDir.empty()){return;}HANDLE hFind;WIN32_FIND_DATA findData;wstring wstrTempDir = wstrDir + (L"\\*");hFind = FindFirstFile(wstrTempDir.c_str(), &findData);if (hFind == INVALID_HANDLE_VALUE){return;}do{// 忽略"."和".."两个结果if (wcscmp(findData.cFileName, L".") == 0 || wcscmp(findData.cFileName, L"..") == 0){continue;}wstring wstrFileName;wstrFileName.assign(wstrDir);wstrFileName.append(L"\\");wstrFileName.append(findData.cFileName);wcout << wstrFileName << endl;} while (FindNextFile(hFind, &findData)!= 0);FindClose(hFind);
}int main()
{	ListFilesInDirectory(L"H:\\miniprogram"); return 0;
}

3.使用递归遍历指定目录下的所有文件(包括子目录中的文件)和目录(包括子目录中的目录)

#include <windows.h>
#include <string>
#include <iostream>
using namespace std;void ListFilesInDirectory(wstring wstrDir)
{if (wstrDir.empty()){return;}HANDLE hFind;WIN32_FIND_DATA findData;wstring wstrTempDir = wstrDir + (L"\\*");hFind = FindFirstFile(wstrTempDir.c_str(), &findData);if (hFind == INVALID_HANDLE_VALUE){return;}do{// 忽略"."和".."两个结果if (wcscmp(findData.cFileName, L".") == 0 || wcscmp(findData.cFileName, L"..") == 0){continue;}wstring wstrFileName;wstrFileName.assign(wstrDir);wstrFileName.append(L"\\");wstrFileName.append(findData.cFileName);wcout << wstrFileName << endl;if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)// 是否是目录{ListFilesInDirectory(wstrFileName.c_str());}} while (FindNextFile(hFind, &findData)!= 0);FindClose(hFind);
}int main()
{	ListFilesInDirectory(L"H:\\miniprogram"); return 0;
}

 


四、删除目录,包括该目录下所有子目录和文件

1.使用 FindFirstFile和FindNextFile

  • RemoveDirectory只能删除空目录
  • DeleteFile只能删除文件
  • 过滤掉"."和".."
  • 先遍历当前目录中的文件,若为文件就删除,若为文件夹,将文件夹名追加到末尾作为新的目录去递归
  • 每次函数结束之前要删除当前目录
  • 假设删除时,某文件正在被使用,则该文件和其所属目录无法被删除,但不影响其他未被使用的文件的删除
#include <windows.h>
#include <string>
#include <iostream>
using namespace std;void RemoveAllFiles(wstring wstrDir)
{if (wstrDir.empty()){return;}HANDLE hFind;WIN32_FIND_DATA findData;wstring wstrTempDir = wstrDir + (L"\\*");;hFind = FindFirstFile(wstrTempDir.c_str(), &findData);if (hFind == INVALID_HANDLE_VALUE){return;}do{// 忽略"."和".."两个结果if (wcscmp(findData.cFileName, L".") == 0 || wcscmp(findData.cFileName, L"..") == 0){continue;}wstring wstrFileName;wstrFileName.assign(wstrDir);wstrFileName.append(L"\\");wstrFileName.append(findData.cFileName);if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)// 是否是目录{			RemoveAllFiles(wstrFileName.c_str());}else{DeleteFile(wstrFileName.c_str());}} while (FindNextFile(hFind, &findData));FindClose(hFind);RemoveDirectory(wstrDir.c_str());
}int main()
{	RemoveAllFiles(L"H:\\miniprogram"); return 0;
}

2.使用SHFileOperation

能直接删除掉目录和该目录下的所有文件和子目录,但是假如该目录下有文件正在被使用,则函数执行失败,一个文件都没被删掉。

SHFILEOPSTRUCT FileOp;
FileOp.fFlags = FOF_NOCONFIRMATION;
FileOp.hNameMappings = NULL;
FileOp.hwnd = NULL;
FileOp.lpszProgressTitle = NULL;
FileOp.pFrom = L"H:\\miniprogram";
FileOp.pTo = NULL;
FileOp.wFunc = FO_DELETE;
SHFileOperation(&FileOp);

参考:

1. https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-findfirstfilew FindFirstFileW function (fileapi.h)

2. https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-findnextfilew FindNextFileW function (fileapi.h)

3. https://docs.microsoft.com/en-us/windows/win32/fileio/listing-the-files-in-a-directory  Listing the Files in a Directory

4. https://blog.csdn.net/WNDCLASSEXW/article/details/86614171  C++遍历删除指定目录下所有文件和文件夹(包括自身)

5. https://blog.csdn.net/u012005313/article/details/46490437  利用FindFirstFile(),FindNextFile()函数历遍指定目录的所有文件

6. http://www.360doc.com/content/11/1102/17/992979_161139651.shtml  FindFirstFile的正确用法

7. https://blog.csdn.net/veryhehe2011/article/details/7769814 FindFirstFile()函数

8. https://blog.csdn.net/weixin_40332490/article/details/105306620 FindFirstFile()


http://chatgpt.dhexx.cn/article/D81C1jyw.shtml

相关文章

如何使用 rmdir 命令删除目录?

rmdir 是您将在开始时学习但很少使用的基本 Linux 命令之一。 为什么&#xff1f; 因为听起来好像 rmdir 用于删除目录&#xff08;即文件夹&#xff09;&#xff0c;但事实是&#xff0c;默认情况下&#xff0c;它只删除空目录。 在 Linux 中使用 rmdir 命令 rmdir 有一个…

java实现删除目录

问题 要求&#xff1a;采用java实现删除指定目录及其下所有文件 如果直接directory.delete()&#xff0c;是不能够直接删除不为空的目录。 这里采用递归实现&#xff0c;首先获取该目录下的所有内容&#xff0c;放到files数组里&#xff0c;然后对于files进行循环&#xff0c;并…

几种删除Linux目录的方法

在Linux中有很多方法可以删除目录&#xff0c;在图形化界面可以利用文件管理器&#xff0c;或者通过终端删除。本文将介绍在文本界面使用命令删除目录。 在Linux中有很多方法可以删除目录&#xff0c;在图形化界面可以利用文件管理器&#xff0c;或者通过终端删除。本文将介绍…

创建和删除目录( mkdir函数 和 rmdir函数 )

文章目录 前言一、目录存储形式二、创建和删除目录mkdir 函数rmdir 函数 前言 目录&#xff08;文件夹&#xff09;在 Linux 系统也是一种文件&#xff0c;是一种特殊文件&#xff0c;同样可以使用前面给大家介绍 open、read 等这些系统调用以及 C 库函数对其进行操作&#xf…

蓝队-ELK日志分析系统Yara规则写入

因为经常使用的是window&#xff0c;所以就用window操作系统直接搭建 需要到Elasticsearch、Logstash、kibana官网下载&#xff0c;且必须版本都一致&#xff0c;本次我使用的是7.6.1版本 Elasticsearch:用于存储收集到的日志信息&#xff1b; Logstash:用于收集日志转发给Ela…

linux 静态编译 yara

最近有个需求&#xff0c;要在go中调用yara&#xff0c;发现官方的go-yara跨平台做的不是很好&#xff0c;于是决定在go中直接调用外部yara程序&#xff0c;这样只需要写一份代码在windows和linux上都能用了。 发现官方只提供了windows的发布程序&#xff0c;linux需要自行编译…

Yara引擎编译和发布

我们自己设计软件时有很多情况都需要集成yara引擎 项目-管理NuGet程序包&#xff0c;下载几个包并安装 确保是git上最新代码即可编译 package目录下的include和lib是自动添加到项目中的。 发布时要注意除了yara编译需要依赖的jansson、libcrypto、libssl这几个库&#xff0…

使用yara分析

有时碰到大批量的样本&#xff0c;又发现其中很多相似点&#xff0c;这个时候就需要模式匹配了&#xff0c;yara在分析中当之无愧。 具体的yara规则是怎么回事&#xff0c;freebuff上有相关的文章&#xff0c;要不然看文档也是可以的。这里只记录我第一次使用的几个步骤。 &…

Yara规则编写

YARA规则的标识符类似于C语言结构&#xff0c;其规则声明以rule标识&#xff0c;在规则描述中可以包括字母、数字甚至下划线字符&#xff0c;但字符串第一个字符不能是数字&#xff0c;且单条描述不能超过128个字符。 Yara关键字 YARA规则由字符串区域和条件区域两部分组成&…

Yara规则以及yargen工具总结

Yara规则以及yargen工具总结 任务目标 yara规则&#xff1b;使用yargen对webshell生成yara规则;使用yara对目标文件进行扫描。 任务一&#xff1a;yara规则 yara规则&#xff1a; 首先我从yara规则的结构出发&#xff0c;yara规则分为两部分&#xff1a;字符串定义和条件表…

Yara安装及python运用

Yara YARA是一款旨在帮助恶意软件研究人员识别和分类恶意软件样本的开源工具&#xff0c;使用YARA可以基于文本或二进制模式创建恶意软件家族描述与匹配信息。现在已经被多家公司所运用于自身的产品。 YARA-规则 YARA规则的字符串有三种类型&#xff1a;文本字符串、十六进制…

[IDAPython] no module name ‘yara‘

继续当配环境博主 问题 在装IDA插件, 比如findcrypt的时候如果IDApython环境缺少需要的包会报错 ModuleNotFoundError: No module named yara还有类似的 ModuleNotFoundError: No module named keystone ...等等 解决 在path/to/IDA/python目录下打开cmd或者powershell, 使…

yara规则--构建yara规则库

零、快速构建yara规则库的方案 Yara官方预置的规则库&#xff0c;链接 https://github.com/Yara-Rules/rules ClamAV的特征码转换为yara规则&#xff0c;利用工具clamav_to_yara.py将clamav的特征码转换为yara规则 从yara-generator爬取别人上传的样本的规则 利用 yarGen工具 …

yara规则--编写

编写 YARA 规则 — yara 4.2.0 文档 YARA规则易于编写和理解&#xff0c;并且它们的语法是 类似于 C 语言。这是您可以编写的最简单的规则 YARA&#xff0c;它什么都不做&#xff1a; rule dummy {condition:false } 一、规则标识符 每个规则都以关键字“ rule”开头&#xff0…

静态扫描之Yara第一话--安装及使用Yara

Yara安装及使用 概述 Yara是一款用于识别恶意软件及对其行为进行分类的安全利器。Yara会根据我们自己编写的yara规则&#xff0c;来对可疑软件进行一个模式匹配&#xff0c;若可疑软件中的一些特征与我们的yara规则匹配上了&#xff0c;则可以初步认定可疑软件为恶意软件。 项…

IDA报错No module named ‘yara‘

问题描述 D:\CTFTools\Reverse\IDA\ida77\plugins\findcrypt3.py: No module named yara Traceback (most recent call last):File "D:\CTFTools\Reverse\IDA\ida77\python\3\ida_idaapi.py", line 580, in IDAPython_ExecScriptexec(code, g)File "D:/CTFTool…

CentOS7下安装yara

Linux之yara的安装和使用 前言一、前置安装包1.安装automake2.安装libtool3.其余包4.SecureCRT 二、安装yara总结 前言 提示&#xff1a;本文将简述在centos下安装yara的方法&#xff1a; 一、前置安装包 在安装yara之前请先确定你的系统中是否已经安装automake&#xff0c;l…

使用 OSquery 和 YARA 进行审计

Part 1: osquery 简介 osquery是适用于 Windows、OSX、Linux 和 FreeBSD 的操作系统工具框架。这些工具使低级操作系统分析和监控既高效又直观。 osquery中的SQL表表示抽象概念&#xff0c;例如运行进程、加载的内核模块、开放式网络连接、浏览器插件、硬件事件或文件哈希。…

yara 实验

yara 实验 免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关. 什么是 yara YARA 是一款旨在帮助恶意软件研究人员识别和分类恶意软件样本的开源工具&#xff0c;使用 YARA 可以基于文本或二进制模式创建恶意软件家族…

yara 分析器

1.下载源码 wget https://github.com/VirusTotal/yara/archive/refs/tags/v4.2.3.tar.gz 2.预编译 tar -zxf yara-4.2.0.tar.gz cd yara-4.2.0 ./bootstrap.shyum -y install automake libtool make gcc pkg-config yum -y flex bison 3.编译与安装 ./bootstrap.sh ./conf…