详解C/C++如何获取路径下所有文件及其子目录的文件名

yizhihongxing

获取一个文件夹下的所有文件及其子目录的文件名可以通过递归遍历文件夹来完成。以下是几个示例代码,演示如何实现这个功能。

方法一:使用C++17中的std::filesystem

基于C++17标准,可以使用std::filesystem库来遍历目录。下面是示例代码:

#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;

void walk_directory(const fs::path& path) {
  for (const auto& entry : fs::directory_iterator(path)) {
    if (entry.is_directory()) {
      walk_directory(entry.path());
    } else {
      std::cout << entry.path() << std::endl;
    }
  }
}

int main() {
  walk_directory("/path/to/directory");
  return 0;
}

上述代码定义了一个函数walk_directory,用于遍历指定目录下的所有文件和子目录。如果遍历到的是子目录,则递归遍历子目录,否则输出文件名。

方法二:使用C语言和POSIX标准库

如果不支持C++17或者希望使用C语言实现,可以使用POSIX标准库中的dirent.h头文件。下面是示例代码:

#include <stdio.h>
#include <dirent.h>
#include <string.h>

void walk_directory(const char *dir) {
    DIR *dp;
    struct dirent *entry;
    if ((dp = opendir(dir)) == NULL) {
        fprintf(stderr, "Cannot open directory: %s\n", dir);
        return;
    }
    chdir(dir);
    while ((entry = readdir(dp)) != NULL) {
        if (entry->d_type == DT_DIR) {
            if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
                continue;
            }
            printf("%*s[%s]\n", 4, "", entry->d_name);
            char subdir[1024];
            snprintf(subdir, sizeof(subdir), "%s/%s", dir, entry->d_name);
            walk_directory(subdir);
        } else {
            printf("%*s- %s\n", 4, "", entry->d_name);
        }
    }
    chdir("..");
    closedir(dp);
}

int main() {
    walk_directory("/path/to/directory");
    return 0;
}

上述代码实现了遍历指定目录下的所有文件和子目录,并输出它们的相对路径。如果遇到子目录,则递归遍历子目录。需要注意的是,这种方法需要手动改变当前工作目录,同时也无法返回文件的绝对路径。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C/C++如何获取路径下所有文件及其子目录的文件名 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言程序 数组的最大值和最小值的

    获取数组的最大值和最小值 使用 C 语言编写程序获取数组的最大值和最小值,可以先利用 for 循环遍历数组,依次将元素与当前最大值和最小值比较,更新最大值和最小值即可。代码如下: #include <stdio.h> int main() { int nums[5] = {1, 2, 3, 4, 5}; int i, max = nums[0],…

    C 2023年5月9日
    00
  • JS实现深拷贝和浅拷贝的方式详解

    关于JavaScript的深拷贝和浅拷贝,一般有如下几种实现方式: 浅拷贝 1. Object.assign() 方法 该方法用于将所有可枚举属性从一个或多个源对象复制到目标对象。如果源对象中有与目标对象相同的属性,那么目标对象对应属性的值将被覆盖。由于该方法只会进行浅拷贝,因此如果源对象中的属性是一个对象或数组等复合类型,那么目标对象和源对象的属性将会引用…

    C 2023年5月23日
    00
  • 自己实现strcpy函数的实现方法

    下面我为你详细介绍一下“自己实现strcpy函数的实现方法”的完整攻略。 1. 了解strcpy函数的作用 在自己实现strcpy函数之前,我们先要了解一下strcpy函数的原理和作用。strcpy函数的作用是将一个字符串复制到另一个字符串中。最常见的使用方式是将一个字符数组复制到另一个字符数组中。 2. 自己实现strcpy函数的方法 现在我们已经了解了s…

    C 2023年5月23日
    00
  • 你知道C++中new和delete为什么要匹配使用吗

    当我们在使用 C++ 时,经常使用 new 和 delete 这两个运算符来进行动态内存的分配和释放。而这两个函数必须要配对使用。 为什么要匹配使用new和delete 在使用 new 分配内存时,系统会分配一块合适大小的内存空间,并返回一个指向该空间的指针。这时如果使用 delete 将该指针所指向的内存释放掉,但是如果后续仍然有程序对该指针进行操作,就会…

    C 2023年5月22日
    00
  • Win10电脑开机失败提示错误0xc0000428怎么办?修复解决办法

    Win10电脑开机失败提示错误0xc0000428的修复解决办法 当我们尝试开机电脑的时候,有时会看到类似“错误0xc0000428:无法验证Windows”的错误提示,这通常是由于Windows启动程序损坏或缺失导致的。接下来,我们将介绍几种可行的解决方法。 方法一:使用Windows恢复环境修复 重启电脑,在Windows启动界面按下电源键强制关闭电脑。…

    C 2023年5月23日
    00
  • 基于C语言sprintf函数的深入理解

    基于C语言sprintf函数的深入理解攻略 sprintf函数是C语言中的一个字符串格式化函数。它可以将格式化的数据输出到目标字符串中。sprintf函数常常被用于将数字或者字符转化成字符串的场景中。在本篇攻略中,我们将从以下几个方面来深入理解sprintf函数: sprintf函数的语法及参数说明 格式化字符串的规则 实际使用示例 sprintf函数的语法…

    C 2023年5月22日
    00
  • C语言超详细讲解队列的实现及代码

    C语言超详细讲解队列的实现及代码 什么是队列 队列(Queue)是一种线性数据结构,它遵循“先进先出”(FIFO)原则。队列通常用于在数据元素到来的顺序的控制和处理。 队列的最常见的两个操作是 enqueue(入队)和 dequeue(出队)。 enqueue操作用于在队列的尾部插入元素。 dequeue操作用于从队列的头部删除元素。 队列的实现 队列可以使…

    C 2023年5月23日
    00
  • C++ STL中五个常用算法使用教程及实例讲解

    C++ STL中五个常用算法使用教程及实例讲解 作为C++语言的标准库之一,STL(Standard Template Library)提供了很多有用的容器和算法,让C++开发者更加高效地编写程序。本文将介绍STL中的五个常用算法,包括排序、查找、遍历、求和和去重,并以实例的形式展示具体使用方法。 排序算法 STL中提供了两个常用的排序算法,即sort和st…

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