用递归写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日

相关文章

  • javascript日期格式化方法汇总

    以下是“JavaScript日期格式化方法汇总的完整攻略”,过程中包含两个示例说明的标准Markdown格式文本: JavaScript日期格式化方法汇总 在JavaScript中,可以使用不同的方法对日期进行格式化。是常用的日期格式化方法: 1. toLocaleDateString() toLocaleDateString()方法返回一个表示日期的字符串…

    other 2023年5月10日
    00
  • 【转】排名前十位的linux发行版介绍

    以下是关于“【转】排名前十位的Linux发行版介绍”的完整攻略: Linux发行版简介 Linux发行版是基于Linux内核的操作系统,由不同的开发者和组织维护和发布。Linux发行版通常包含了Linux内核、软件包管理器、桌面环境、应用程序等组件,可以用于桌面、服务器、嵌入式等不同的场景。 排名前十Linux发行版介绍 以下是一些排名前十位的Linux发行…

    other 2023年5月9日
    00
  • 12款javascript表格控件(datagrid)

    以下是“12款JavaScript表格控件(datagrid)”的完整攻略: 12款JavaScript表格控件(datagrid) JavaScript表格控件是Web开发中常用的UI组件之一,它可以用于显示和编辑数据。本攻略将介绍12款常用的JavaScript表格控件,包括它的特点和使用方法。 1. DataTable DataTables是一款功能强…

    other 2023年5月7日
    00
  • mac平台下部署ue4工程到ios设备的流程

    mac平台下部署ue4工程到ios设备的流程 如果你想在Mac平台上部署UE4工程到iOS设备上,那么你需要遵循以下步骤: 步骤一:安装 MacOS 平台和 Unreal Engine 4 首先,确保你的Mac电脑上已安装了最新版本的macOS。同时,你也需要确保你安装了最新版本的Unreal Engine 4(UE4)。如果你还没有安装UE4,你可以通过以…

    其他 2023年3月29日
    00
  • Win10正式版ESD升级镜像官方下载地址汇总(64为/32位)

    Win10正式版ESD升级镜像官方下载地址汇总(64位/32位)攻略 本攻略将详细介绍如何获取Win10正式版ESD升级镜像的官方下载地址,并提供两个示例说明。 步骤一:访问官方网站 首先,打开你的网络浏览器,并访问微软官方网站。你可以在以下网址找到官方下载页面: https://www.microsoft.com/zh-cn/software-downlo…

    other 2023年8月4日
    00
  • 神盾加密解密教程(一)PHP变量可用字符

    神盾加密解密教程(一)PHP变量可用字符 简介 在PHP编程中,变量是存储数据的容器。在使用变量时,需要注意变量名的命名规则和可用字符。本教程将详细讲解PHP变量可用字符的规定。 可用字符规定 PHP变量名可以包含字母、数字和下划线(_),并且必须以字母或下划线开头。变量名对大小写敏感,即$myVar和$myvar是两个不同的变量。 以下是PHP变量名可用字…

    other 2023年8月9日
    00
  • 关于AutoCAD 2010在VS 2010上无法调试问题的解决方法

    下面就详细讲解一下“关于AutoCAD 2010在VS 2010上无法调试问题的解决方法”的完整攻略。 问题描述 当我们使用VS 2010进行开发,配合AutoCAD 2010进行调试时,可能会遇到无法调试的问题。此时,在VS的调试工具栏上,启用“调试 – 附加到进程”命令后,无法找到AutoCAD进程。 问题原因 AutoCAD 2010是一个大型的CAD…

    other 2023年6月26日
    00
  • postcss那些事儿

    PostCSS是一个基于JavaScript的CSS处理器,它可以帮助开发人员自动化CSS的编写和优化。在本文中,我们将详细介绍PostCSS的使用方法和常用插件,并提供两个示例说明。 PostCSS的使用方法 使用PostCSS非常简单,只需要在项目中安装PostCSS和所需的插件,然后在构建工具中配置PostCSS即可。以下是一个使用PostCSS的示例…

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