Win32是Windows应用程序编程接口的一部分,用于编写Windows平台的应用程序。在Win32中,遍历文件夹是一项非常常见的任务。其中之一的实现方式是递归。本文将介绍使用递归编写Win32文件夹遍历的完整攻略,包括以下步骤:
步骤一:准备工作
首先需要引入主文件:
#include <Windows.h>
#include <iostream>
#include <stack>
using namespace std;
在Win32平台上遍历文件夹需要调用相关的API函数,因此需要引入Windows.h头文件。另外,使用stack数据结构来存储文件夹路径。
然后需要定义一个遍历文件夹的函数:
void TraverseDirectory(const string& path);
此函数将接收文件夹的路径作为参数。
步骤二:递归遍历
在函数 TraverseDirectory 中,首先需要定义一个 WIN32_FIND_DATA 结构体,以存储当前文件夹中的每个文件的信息:
WIN32_FIND_DATA fd;
接下来,需要调用 FindFirstFile 函数,以查找该文件夹的第一个文件。如果该函数成功执行,则返回第一个文件的句柄:
HANDLE handle = FindFirstFile((path + "/*").c_str(), &fd);
其中,(path + "/*") 是遍历的目标文件夹路径,/代表分隔符。
如果查找失败,则退出:
if (handle == INVALID_HANDLE_VALUE) {
return;
}
否则,可以依次遍历目标文件夹中的每一个文件/文件夹,其中遍历到的文件和文件夹的名称存储在 WIN32_FIND_DATA 结构体中的 cFileName 字段中。可以通过判断此处名称是否为“.” 或 “..”来过滤掉文件夹的特殊路径:
do {
if (strcmp(fd.cFileName, ".") != 0 && strcmp(fd.cFileName, "..") != 0) {
// Handle file or directory
}
} while (FindNextFile(handle, &fd));
如果遍历到的文件是一个目录,则需要以递归的方式进行遍历,以便访问该目录中的每个文件。此处在堆栈中记录该目录的路径,并在递归调用 TraverseDirectory 函数时将该路径作为参数传递到函数中:
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
stack<string> directories;
directories.push(path + "/" + fd.cFileName);
while (!directories.empty()) {
TraverseDirectory(directories.top());
directories.pop();
}
}
最后,清理资源:
FindClose(handle);
示例一:只打印文件名并过滤.txt文件
void TraverseDirectory(const string& path) {
WIN32_FIND_DATA fd;
HANDLE handle = FindFirstFile((path + "/*").c_str(), &fd);
if (handle == INVALID_HANDLE_VALUE) {
return;
}
do {
if (strcmp(fd.cFileName, ".") == 0 || strcmp(fd.cFileName, "..") == 0) {
continue;
}
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
stack<string> directories;
directories.push(path + "/" + fd.cFileName);
while (!directories.empty()) {
TraverseDirectory(directories.top());
directories.pop();
}
} else {
string fileName = fd.cFileName;
if (fileName.rfind(".txt") == fileName.length() - 4) {
cout << fileName.substr(0, fileName.length() - 4) << endl;
}
}
} while (FindNextFile(handle, &fd));
FindClose(handle);
}
int main() {
TraverseDirectory("C:/testfolder");
return 0;
}
该示例程序只输出.txt文件名,其他文件将被忽略,输出结果如下:
file1
file2
file3
示例二:输出路径并忽略系统文件夹
void TraverseDirectory(const string& path) {
WIN32_FIND_DATA fd;
HANDLE handle = FindFirstFile((path + "/*").c_str(), &fd);
if (handle == INVALID_HANDLE_VALUE) {
return;
}
do {
if (strcmp(fd.cFileName, ".") == 0 || strcmp(fd.cFileName, "..") == 0) {
continue;
}
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)) {
cout << path + "/" + fd.cFileName << endl;
stack<string> directories;
directories.push(path + "/" + fd.cFileName);
while (!directories.empty()) {
TraverseDirectory(directories.top());
directories.pop();
}
}
}
} while (FindNextFile(handle, &fd));
FindClose(handle);
}
int main() {
TraverseDirectory("C:/testfolder");
return 0;
}
该示例程序输出文件夹的路径,但忽略了系统文件夹,避免了系统文件夹误删除等问题,输出结果如下:
C:/testfolder/subfolder1
C:/testfolder/subfolder1/subfolder2
C:/testfolder/subfolder1/subfolder2/subfolder3
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用递归写Win32的文件夹遍历 - Python技术站