用递归写Win32的文件夹遍历

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技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • ddb是什么文件格式?.ddb文件怎么打开?

    DDB是什么文件格式? DDB文件格式是一种用于存储数据库的文件格式,它是DynamoDB的本地存储格式。DynamoDB是亚马逊提供的一种NoSQL数据库服务。DDB文件包含了表格、索引和数据等信息,可以在本地环境中使用。 DDB文件怎么打开? 要打开DDB文件,您可以按照以下步骤进行操作: 安装DynamoDB本地环境:首先,您需要在本地计算机上安装Dy…

    other 2023年8月6日
    00
  • MySQL中可为空的字段设置为NULL还是NOT NULL

    MySQL中,字段的空值可以被设置为NULL或NOT NULL。那么在创建数据表或更新表中的字段时,应该将该字段设置为NULL还是NOT NULL呢?这里提供一个完整的攻略来帮助你做出正确的决定。 什么是NULL和NOT NULL? NULL表示该字段可以为空,即无需为该字段提供值。可以使用以下语法来将字段设为NULL: CREATE TABLE my_ta…

    other 2023年6月26日
    00
  • idea安装与配置及基本用法教程详解

    IDEA安装与配置及基本用法教程详解 安装 下载 首先需要在JetBrains官网下载适合自己操作系统的版本,目前有两个版本,一个是Community版,一个是Ultimate版,在使用上两者并无明显区别,但Ultimate版会更加适合专业开发者。 安装 下载完成后,直接进行安装,安装界面很简单,一路下一步即可。安装的时候建议不要更改默认安装路径,这样方便后…

    other 2023年6月25日
    00
  • Linux系统的垃圾清理方法总结

    Linux系统的垃圾清理方法总结 什么是垃圾清理? 垃圾清理是指在Linux系统上清除没有用处或者不必要的文件和目录的操作,通过垃圾清理操作能够释放存储空间并提供系统的整体性能。 垃圾清理方法 1. apt-get autoclean 使用 apt-get autoclean 命令可以清理废弃的包文件(不包括当前安装软件所依赖的文件)。 sudo apt-g…

    other 2023年6月27日
    00
  • C++超详细讲解拷贝构造函数

    C++超详细讲解拷贝构造函数 什么是拷贝构造函数 C++中的拷贝构造函数是一种特殊的构造函数,用于关于同类对象进行复制初始化。当使用一个对象去初始化另一个同类对象时,就会调用拷贝构造函数。拷贝构造函数通常使用一个类的引用作为其参数,并且不允许传入除该引用以外的任何值。 拷贝构造函数的使用场景 传递类对象给函数时,会调用拷贝构造函数; 返回类对象时,会调用拷贝…

    other 2023年6月26日
    00
  • win7系统鼠标右键没响应怎么办?win7系统浏览网页点击鼠标右键没反应的两种解决方法

    针对win7系统鼠标右键没响应的问题,以下是两种解决方法: 方法一:检查鼠标驱动 鼠标右键无响应的情况,第一步需要检查鼠标驱动是否正常,可以尝试以下步骤: 在桌面上单击“计算机”图标; 展开控制面板,选择“设备管理器”; 在设备管理器的“鼠标和其他指向设备”下,找到你的鼠标,右键选择“属性”; 在属性窗口中选择“驱动程序”选项卡,然后选择“更新驱动程序”; …

    other 2023年6月27日
    00
  • OPPO R17如何重启?OPPO R17重启手机教程

    OPPO R17如何重启? 如果你的OPPO R17出现了卡顿、无响应、闪退等问题,可以尝试重启手机来解决。重启手机是一种快速而有效的方法,下面我们详细介绍OPPO R17的重启手机教程。 方法一:软重启 软重启可以在不关机的情况下让手机重启。具体步骤如下: 长按手机电源键。 在弹出的选项中选择“重启”。 点击“确认”按钮,手机将会重新启动。 方法二:硬重启…

    other 2023年6月26日
    00
  • ios8.0.2固件下载地址 苹果iOS8.0.2(12A405)固件官方下载大全

    iOS 8.0.2固件下载地址攻略 苹果iOS 8.0.2(12A405)固件是苹果公司发布的一个重要更新版本。本攻略将详细介绍如何获取iOS 8.0.2固件的下载地址,并提供两个示例说明。 步骤一:访问苹果官方网站 首先,打开您的网络浏览器,并访问苹果公司的官方网站 https://www.apple.com。 步骤二:导航至iOS下载页面 在苹果官方网站…

    other 2023年8月4日
    00
合作推广
合作推广
分享本页
返回顶部