C++非递归遍历磁盘文件和递归遍历磁盘文件的程序示例

yizhihongxing

当我们需要对一个文件夹下的所有文件进行遍历时,可以使用递归方式或者非递归方式实现。下面分别详细讲解一下这两种实现方式。

递归遍历文件夹

递归遍历文件夹的实现方式是通过调用自身函数来实现,具体步骤如下:

  1. 定义一个函数,该函数接收一个文件夹路径作为参数。
  2. 打开这个文件夹,遍历其中的所有文件和文件夹。
  3. 对于每个文件夹,调用该函数来再次遍历其中的文件和文件夹。
  4. 对于每个文件,进行相应的操作。

下面是C++程序示例:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<direct.h>
#include<io.h>
using namespace std;

void RecursiveTraverseFolder(const char*);

int main()
{
    RecursiveTraverseFolder("C:\\Users\\Desktop\\test");
    return 0;
}

void RecursiveTraverseFolder(const char* folderPath)
{
    struct _finddata_t file;
    intptr_t handle;
    char path[100];

    // 匹配所有文件和文件夹
    sprintf(path, "%s\\*.*", folderPath);
    handle = _findfirst(path, &file);
    if (handle == -1)   
    {
        cout << "查找文件失败" << endl;
        return;
    }
    do
    {
        if (file.attrib & _A_SUBDIR)    // 判断是否是文件夹
        {
            if (strcmp(file.name, ".") != 0 && strcmp(file.name, "..") != 0)   // 排除 . 和 ..
            {
                sprintf(path, "%s\\%s", folderPath, file.name);
                cout << path << endl;   // 对文件夹进行相应操作
                RecursiveTraverseFolder(path);  // 递归遍历
            }
        }
        else   // 文件
        {
            sprintf(path, "%s\\%s", folderPath, file.name);
            cout << path << endl;   // 对文件进行相应操作
        }
    } while (_findnext(handle, &file) == 0);
    _findclose(handle);
}

非递归遍历文件夹

非递归遍历文件夹的实现方式是使用一个栈来存储文件夹的路径,具体步骤如下:

  1. 定义一个栈,用于存储文件夹路径。
  2. 将要遍历的文件夹路径入栈。
  3. 循环遍历所有入栈的文件夹,对于每个文件夹遍历其中的文件和文件夹并进行相应的操作。
  4. 每次遍历完一个文件夹后,将该文件夹从栈中弹出。

下面是C++程序示例:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<direct.h>
#include<io.h>
#include<stack>
using namespace std;

void NonRecursiveTraverseFolder(const char*);

int main()
{
    NonRecursiveTraverseFolder("C:\\Users\\Desktop\\test");
    return 0;
}

void NonRecursiveTraverseFolder(const char* folderPath)
{
    _finddata_t file;
    stack<string> folderStack;
    string path;
    intptr_t handle;

    folderStack.push(folderPath);
    while (!folderStack.empty())
    {
        path = folderStack.top();
        folderStack.pop();

        // 匹配所有文件和文件夹
        handle = _findfirst((path + "\\*.*").c_str(), &file);
        if (handle == -1)
        {
            cout << "查找文件失败" << endl;
            continue;
        }
        do
        {
            if (file.attrib & _A_SUBDIR)    // 判断是否是文件夹
            {
                if (strcmp(file.name, ".") != 0 && strcmp(file.name, "..") != 0)   // 排除 . 和 ..
                {
                    folderStack.push(path + "\\" + file.name);    // 文件夹路径入栈
                    cout << path + "\\" + file.name << endl;   // 对文件夹进行相应操作
                }
            }
            else   // 文件
            {
                cout << path + "\\" + file.name << endl;   // 对文件进行相应操作
            }
        } while (_findnext(handle, &file) == 0);
        _findclose(handle);
    }
}

这两种实现方式的具体实现方式略有不同,但是都能够实现遍历文件夹的功能。我们可以根据具体需求选择合适的实现方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++非递归遍历磁盘文件和递归遍历磁盘文件的程序示例 - Python技术站

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

相关文章

  • C++中链表操作实例分析

    C++中链表操作实例分析 什么是链表 链表(Linked List)是一种常见的数据结构,它由一系列节点组成,每个节点包含两个部分,一个是数据,另一个是指向下一个节点的指针。通过这些指针将节点串联起来,形成一个链表。 链表的数据结构定义 struct ListNode { int val; ListNode *next; ListNode(int x) : …

    other 2023年6月27日
    00
  • Android仿美团外卖菜单界面

    Android仿美团外卖菜单界面攻略 简介 本攻略将详细讲解如何实现一个仿美团外卖菜单界面的Android应用。该应用将包含以下功能:- 展示菜单列表- 添加菜品到购物车- 查看购物车内容- 结算购物车 步骤 步骤一:创建项目 首先,创建一个新的Android项目。可以使用Android Studio来完成这一步骤。 步骤二:设计界面 设计菜单界面需要使用R…

    other 2023年8月20日
    00
  • JS中封装axios来管控api的2种方式

    在JS中,使用axios作为网络请求库是非常常见的。在实际应用中,我们需要封装axios来管理API,以便于维护和升级。这里介绍两种常见的封装axios的方式。 方式一:基于axios.create()方法 通过axios.create()方法创建一个新的axios实例,然后在这个实例中设置一些统一的请求头、请求拦截器和响应拦截器等。示例代码如下: impo…

    other 2023年6月25日
    00
  • 优化大师进程管理大师

    下面是“优化大师进程管理大师”的完整攻略,主要涵盖以下步骤: 1. 下载安装“优化大师” 首先,我们需要下载安装“优化大师”软件。该软件可以从官方网站或者一些软件下载网站中下载。在安装过程中,需要按照提示进行操作,确认安装路径等信息。 2. 打开“优化大师” 安装完成后,打开“优化大师”软件。 3. 进入进程管理模块 在“优化大师”软件中,我们可以看到很多功…

    other 2023年6月25日
    00
  • 详解Java单元测试之JUnit篇

    当然!以下是关于Java单元测试之JUnit的详细攻略,包含两个示例说明: JUnit简介 JUnit是一个流行的Java单元测试框架,用于编写和运行可重复的、自动化的单元测试。它提供了一组注解和断言方法,使得编写和执行测试变得简单和高效。 步骤1:导入JUnit依赖 首先,确保在项目的构建文件(如Maven的pom.xml)中添加JUnit依赖。在depe…

    other 2023年10月19日
    00
  • php上传apk后自动提取apk包信息的使用(示例下载)

    详细讲解“php上传apk后自动提取apk包信息的使用(示例下载)” 在PHP中,我们可以通过一些库和工具来实现上传APK文件并自动提取APK包信息的功能。下面是一个完整的攻略,包含两个示例说明。 示例1:上传APK文件 首先,我们需要创建一个HTML表单,用于上传APK文件。在表单中,我们使用<input type=\”file\”>元素来实现…

    other 2023年10月13日
    00
  • java代码块详解

    以下是“Java代码块详解的完整攻略”的详细讲解,过程中包含两个示例说明的标准Markdown格式文本: Java代码块详解的完整攻略 Java代码块是一被大括号包围的代码,它可以用于初始化类、对象或静态变量。Java代码块分为静态代码块和非静态代码块两种类型。以下是Java代码块的详细说明: 1. 静态代码块 静态代码块是在类加载时执行的代码块,它可以用于…

    other 2023年5月10日
    00
  • c#中判断字符串中包含某个字符

    C#中判断字符串中包含某个字符 在C#编程中,我们经常需要对字符串进行一些操作,其中包括判断字符串中是否包含某个字符。本文将介绍C#中几种判断字符串中包含某个字符的方法。 1. 使用String.Contains()方法 String.Contains()方法是判断字符串中是否包含某个指定的字符序列。下面是使用String.Contains()方法判断字符串…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部