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

 更新时间:2023年03月14日 11:34:34   作者:凡人只做一事  
这篇文章主要为大家详细介绍了在C/C++中如何获取路径下所有文件及其子目录的文件名,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下

一、功能描述

需要提取某个文件夹下所有文件名字,当包含子目录时,将子目录及其路径获取到。

二、实现方式

使用C语言的opendir函数

  DIR* dp;
  struct dirent* dirp;
  if ((dp = opendir(sdir.c_str())) != NULL) {
      dirp = readdir(dp)
  }

通过readir读取到的dirp中包含的d_type具有如下类型及其含义:

enum
  {
    DT_UNKNOWN = 0,
# define DT_UNKNOWN    DT_UNKNOWN
    DT_FIFO = 1,
# define DT_FIFO    DT_FIFO
    DT_CHR = 2,
# define DT_CHR        DT_CHR
    DT_DIR = 4,
# define DT_DIR        DT_DIR
    DT_BLK = 6,
# define DT_BLK        DT_BLK
    DT_REG = 8,
# define DT_REG        DT_REG
    DT_LNK = 10,
# define DT_LNK        DT_LNK
    DT_SOCK = 12,
# define DT_SOCK    DT_SOCK
    DT_WHT = 14
# define DT_WHT        DT_WHT
  };

参考官方文档可知

DT_UNKNOWN ¶
The type is unknown. Only some filesystems have full support to return the type of the file, others might always return this value.
未知类型
DT_REG
A regular file. 常规文件
DT_DIR
A directory. 目录

DT_FIFO
A named pipe, or FIFO. See FIFO Special Files.

DT_SOCK
A local-domain socket. 套接字文件

DT_CHR
A character device. 字符设备

DT_BLK
A block device. 块设备,比如挂载的硬盘之类

DT_LNK
A symbolic link. 链接文件

三、代码实现

通过递归的方式,获取该目录及其子目录下的所有文件及其路径名

#include <dirent.h>
#include <vector>
/**
 * @brief GetFiles: 获取文件夹内的所有文件名字
 * @param sdir
 * @param bsubdir: true 包含子目录下的文件
 * @return
 */
std::vector<std::string> GetFiles(const std::string& sdir = ".",
                                  bool bsubdir = true) {
  DIR* dp;
  struct dirent* dirp;
  std::vector<std::string> filenames;
  if ((dp = opendir(sdir.c_str())) != NULL) {
    while ((dirp = readdir(dp)) != NULL) {
      if (strcmp(".", dirp->d_name) == 0 || strcmp("..", dirp->d_name) == 0)
        continue;
      if (dirp->d_type != DT_DIR)
        filenames.push_back(sdir + "/" + dirp->d_name);
      if (bsubdir && dirp->d_type == DT_DIR) {
        std::vector<std::string> names = GetFiles(sdir + "/" + dirp->d_name);
        filenames.insert(filenames.begin(), names.begin(), names.end());
      }
    }
  }
  closedir(dp);
  return filenames;
}

到此这篇关于详解C/C++如何获取路径下所有文件及其子目录的文件名的文章就介绍到这了,更多相关C++获取路径下文件文件名内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++遍历文件夹获取文件列表

    C++遍历文件夹获取文件列表

    这篇文章主要为大家详细介绍了C++遍历文件夹获取文件列表的相关资料,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Windows系统vscode安装与配置G++、Cmake的图文步骤

    Windows系统vscode安装与配置G++、Cmake的图文步骤

    本文主要介绍了Windows系统vscode安装与配置G++、Cmake的步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • 实例讲解C++设计模式编程中State状态模式的运用场景

    实例讲解C++设计模式编程中State状态模式的运用场景

    这篇文章主要介绍了实例讲解C++设计模式编程中State状态模式的运用场景,文章最后的适用性部分则介绍了一些State模式善于处理的情况,需要的朋友可以参考下
    2016-03-03
  • C语言详解关键字sizeof与unsigned及signed的用法

    C语言详解关键字sizeof与unsigned及signed的用法

    这篇文章主要为大家详细介绍了C语言关键字sizeof&&unsigned&&signed,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • vscode刷acm、leetcode的题目

    vscode刷acm、leetcode的题目

    vscode是一款越来越受码农们喜爱的软件,大多数人学习编程绕不开的一部分就是算法,很多人都喜欢刷LeetCode的题目,本文就来介绍一下
    2021-06-06
  • C++标准库介绍及使用string类的详细过程

    C++标准库介绍及使用string类的详细过程

    C++中将string封装为单独的类,string 类是 C++ 标准库中的一个非常重要的类,用于表示和操作字符串,这篇文章主要介绍了C++标准库介绍及使用string类,需要的朋友可以参考下
    2024-08-08
  • C++实现raw_input的方法

    C++实现raw_input的方法

    这篇文章主要介绍了C++实现raw_input的方法,通过C++来实现Python中发raw_input的方法,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • jQuery移动页面开发中主题按钮的设计示例

    jQuery移动页面开发中主题按钮的设计示例

    这篇文章主要介绍了jQuery移动页面开发中主题按钮的设计示例,jQuery是当今最具人气的JavaScript开发类库,需要的朋友可以参考下
    2015-12-12
  • C++设计模式迪米特法则实例

    C++设计模式迪米特法则实例

    这篇文章主要为大家详细介绍了C++设计模式迪米特法则实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • C++虚函数表的原理与使用解析

    C++虚函数表的原理与使用解析

    对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。本文就将详细讲讲虚函数表的原理与使用,需要的可以参考一下
    2022-04-04

最新评论