Linux递归访问文件目录

2023-05-16

Linux递归访问文件目录


#include < iostream>
#include < cstring>
#include < cstdlib>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <errno.h>
#include < iomanip>
#include < string>
#include < vector>
#include < fstream>
const int STRING_LEN = 20;

void printDIR(const char* path);
void printDIRRecursive(const char* path);

void printDIR(const char* path){

DIR* pDir = opendir(path);
if(pDir == nullptr){
    perror("opendir failed!");
    return ;
}

struct dirent* pDirent = nullptr;
while((pDirent = readdir(pDir)) != nullptr){
    if(strcmp(pDirent->d_name,".") == 0 || strcmp(pDirent->d_name,"..") == 0)
        continue;
    std::cout << "["<< std::setw(STRING_LEN) << pDirent->d_name << "] \t----->";
    switch(pDirent->d_type){
        case DT_BLK:
            std::cout << "块设备文件" << std::endl;
            break;
        case DT_CHR:
            std::cout << "字符设备文件" << std::endl;
            break;
        case DT_DIR:
            std::cout << "目录文件" << std::endl;
            break;
        case DT_FIFO:
            std::cout << "管道文件" << std::endl;
            break;
        case DT_LNK:
            std::cout << "链接文件" << std::endl;
            break;
        case DT_REG:
            std::cout << "普通文件" << std::endl;
            break;
        case DT_SOCK:
            std::cout << "socket文件" << std::endl;
            break;
        case DT_UNKNOWN:
            std::cout << "未知文件类型" << std::endl;
            break;
    }
}

closedir(pDir);

}

void printDIRRecursive(const char* path){
const std::string _path(path);
static int depth = 0;

DIR* pDir = opendir(_path.c_str());
if(pDir == nullptr){
    perror("opendir failed!");
    return ;
}

struct dirent* pDirent = nullptr;
while((pDirent = readdir(pDir)) != nullptr){
    std::string name;
    for(int i = 0;i < depth;i++)
        name += "\t";
    
    name += ("[");
    name += pDirent->d_name;
    name += "]";
    
    if(strcmp(pDirent->d_name,".") == 0 || strcmp(pDirent->d_name,"..") == 0)
        continue;
    
    switch(pDirent->d_type){
        case DT_BLK:
            std::cout << name << ":块设备文件" << std::endl;
            break;
        case DT_CHR:
            std::cout << name << ":字符设备文件" << std::endl;
            break;
        case DT_DIR:
            std::cout << name << ":目录文件" << std::endl;
            name = _path;
            name += "/";
            name += pDirent->d_name;
            depth++;
            printDIRRecursive(name.c_str());
            break;
        case DT_FIFO:
            std::cout << name << ":管道文件" << std::endl;
            break;
        case DT_LNK:
            std::cout << name << ":链接文件" << std::endl;
            break;
        case DT_REG:
            std::cout << name << ":普通文件" << std::endl;
            break;
        case DT_SOCK:
            std::cout << name << ":socket文件" << std::endl;
            break;
        case DT_UNKNOWN:
            std::cout << name << ":未知文件类型" << std::endl;
            break;
    }
}

closedir(pDir);
depth--;

}

void printDIRRecursive(const char* path,std::vectorstd::string& path_vec){
const std::string _path(path);
static int depth = 0;

DIR* pDir = opendir(_path.c_str());
if(pDir == nullptr){
    perror("opendir failed!");
    return ;
}

struct dirent* pDirent = nullptr;
while((pDirent = readdir(pDir)) != nullptr){
    std::string name;
    for(int i = 0;i < depth;i++)
        name += "\t";
    
    name += ("[");
    name += pDirent->d_name;
    name += "]";
    
    if(strcmp(pDirent->d_name,".") == 0 || strcmp(pDirent->d_name,"..") == 0)
        continue;
    
    switch(pDirent->d_type){
        case DT_BLK:
            name += ":块设备文件";
            path_vec.push_back(name);
            break;
        case DT_CHR:
            name += ":字符设备文件";
            path_vec.push_back(name);
            break;
        case DT_DIR:
            name += ":目录文件";
            path_vec.push_back(name);
            name = _path;
            name += "/";
            name += pDirent->d_name;
            depth++;
            printDIRRecursive(name.c_str(),path_vec);
            break;
        case DT_FIFO:
            name += ":管道文件";
            path_vec.push_back(name);
            break;
        case DT_LNK:
            name += ":链接文件";
            path_vec.push_back(name);
            break;
        case DT_REG:
            name += ":普通文件";
            path_vec.push_back(name);
            break;
        case DT_SOCK:
            name += ":socket文件";
            path_vec.push_back(name);
            break;
        case DT_UNKNOWN:
            name += ":未知文件类型";
            path_vec.push_back(name);
            break;
    }
}

closedir(pDir);
depth--;

}

int main(int argc,char* argv[]){
for(int i = 0;i < argc;i++)
std::cout << i <<": " << argv[i] << std::endl;

printDIR(argv[1]);
std::cout << std::endl;
printDIRRecursive(argv[1]);
std::vector<std::string> path;
printDIRRecursive(argv[1],path);
std::ofstream out("dir_path.txt");
for(std::string path_name: path)
    out << path_name << std::endl;
return 0;

}

图片:
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux递归访问文件目录 的相关文章

  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 如何使用 Cloud Init 挂载未格式化的 EBS 卷

    Context 我正在使用https wiki jenkins io display JENKINS Amazon EC2 Plugin https wiki jenkins io display JENKINS Amazon EC2 Pl
  • linux-x64 二进制文件无法在 linuxmusl-x64 平台上使用错误

    我正在安装Sharp用于使用 package json 的 Nodejs 项目的 docker 映像上的映像压缩包 当我创建容器时 我收到有关 Sharp 包的以下错误 app node modules sharp lib libvips
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • 如何使用waf构建共享库?

    我想使用构建一个共享库waf http code google com p waf 因为它看起来比 GNU 自动工具更容易 更简洁 到目前为止 我实际上有几个与我开始编写的 wscript 有关的问题 VERSION 0 0 1 APPNA
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 配置tomat的server.xml文件并自动生成mod_jk.conf

    我在用apache 2 2 15 and tomcat6 6 0 24 on CentOS 6 4并希望使用 tomcat 服务器的功能 通过添加以下内容自动生成 mod jk conf 文件
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • 使用 gdb 调试 Linux 内核模块

    我想知道 API 在内核模块 中返回什么 从几种形式可以知道 这并不是那么简单 我们需要加载符号表来调试内核模块 所以我所做的就是 1 尝试找到内核模块的 text bss和 data段地址 2 在 gdb 中使用 add symbol f
  • cdc_acm:无法设置 dtr/rts - 无法与 USB cdc 设备通信

    我试图使用 pic24fj128gb206 枚举 usb cdc 设备 设备似乎已正确枚举 但是当我将设备连接到 Linux PC 时 我从内核收到以下警告消息 cdc acm 1 8 1 6 7 1 0 failed to set dtr
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4
  • 研究缓冲区溢出时应该使用哪些版本的 GCC 或标志?

    最近 作为计算机工程专业的本科生 我一直在研究缓冲区溢出 出于兴趣 我开始研究缓冲区溢出 但在尝试在我的计算机上用 GCC 4 9 1 在 Debian Jessie 中 编译的我自己的 C 程序中实现它们时遇到了困难 我听说较新的编译器中
  • Linux下显卡内存使用情况

    Linux下有哪些工具可以监控显卡内存使用情况 NVIDIA 性能套件 http developer nvidia com content nvidia perfkit有Linux版本 可以实时监控各种显卡属性 包括显卡内存使用情况 显然
  • 如何wget目录中最新的文件

    我想编写一个 bash 脚本来下载并安装最新的每日构建程序 RStudio 是否有可能使wget仅下载目录中最新的文件http www rstudio org download daily desktop http www rstudio
  • 使用awk将列中的值替换为txt文件中的另一个值

    我是 Linux 和 awk 脚本编写的新手 我有 tab delim txt 文件 如下所示 AAA 134 145 Sat 150 167 AAA 156 167 Sat 150 167 AAA 175 187 Sat 150 167
  • 如何在Linux中自动启动需要X的应用程序

    我试图在系统进入运行级别 5 时自动启动 X 应用程序 这样做的正确方法是什么 我写了一个脚本并将其放在 etc init d 中 我已运行适当的 chkconfig 命令来设置 etc rcX d 目录中的符号链接 一切工作正常 除了当我

随机推荐

  • Git 学习笔记

    目录 教程链接常用命令 教程链接 廖雪峰Git教程 Git官方教程 常用命令 工程准备 git init git clone 新增 删除 移动文件到暂存区 git add git rm git mv 查看工作区 git diff git s
  • 对vector元素取址 时出现的问题

    一般不建议对vector里的元素进行取址 xff0c 除非vector已经填充完毕 xff0c 即size不再变化时才可取址 因为如果vector未填充完毕时 xff0c 此时把某一元素地址赋给一个指针p xff0c 后续如果对vector
  • maskrcnn_benchmark使用过程 错误记录

    在使用maskrcnn的benchmark框架的时候训练突然报错 xff1a Non existent config key MODEL ROI BOX HEAD NUM CLASSES 39 之前还能正常运行的 xff0c 突然就报错 x
  • CMakeLists.txt书写规则记录

    编写自己的CMakeLists txt 1 一个CMakeLists txt的基本内容2 项目包含多个文件或文件夹时添加方式3 添加链接库 1 一个CMakeLists txt的基本内容 span class token comment 编
  • 1-FreeRTOS入门指南

    本专栏是根据官方提供的文档进行FreeRTOS的各个功能函数的说明 xff0c 以及函数的使用 本专栏不涉及动手操作 xff0c 只是对原理进行说明 xff0c FreeRTOS基础知识篇更新完成会对如何在开发板上进行上手实战操作 这里不会
  • 2-FreeRTOS编码标准、风格指南

    1 编码标准 FreeRTOS源文件 对所有端口通用 xff0c 但对端口层不通用 符合MISRA编码标准指南 使用pc lint和链接lint配置文件检查遵从性 由于标准有很多页长 xff0c 并且可以从MISRA处以非常低的费用购买 x
  • 4-FreeRTOS队列、互斥、信号量

    1 队列 队列 xff08 我对队列的理解就是上体育课 xff0c 排队这种 xff09 是任务之间通信的一种方式 队列可以用于任务和任务之间或者中断和任务之间消息的接收与发送 在多数情况下 xff0c 他们消息缓冲是按照FIFO xff0
  • QT教程demo之串口助手代码设计实现

    关注WeChat Official Account 南山府嵌入式获取更多精彩 我创建了一个群关注V号后加入 因为这里不允许添加二维码 代码 xff1a QT Pr 1 QT开发串口助手需要的基本文件 在QT6开发串口助手时 xff0c 通常
  • 自己动手写全套无人驾驶算法系列(四)机器人2D SLAM

    自己动手写全套无人驾驶算法系列 xff08 四 xff09 机器人2D SLAM 目录 一 概述 1 1 系列整体概述 二 传感器层 2 1 轮式里程计 2 2 IMU 2 3 激光雷达 2 4 视觉VO 三 建图层 3 1 静态二值贝叶斯
  • 深入理解如何不费吹灰之力搭建一个无人驾驶车(一)2D-小车底盘部分

    一 搭建综述 无人驾驶最新很流行 xff0c 但是很多人都觉得这东西蛮高大上的 xff0c 因为CSDN还没有一个完整的介绍无人驾驶车如何做的博文 xff0c 都很零散或者简略 其实有了ROS xff0c 这东西一个小学生都可以搭 xff0
  • 深入理解如何不费吹灰之力搭建一个无人驾驶车(五)2.5D-汽车自主部分(从无到有自己写一个主流无人驾驶框架如apollo)(CSDN独创)

    五 从无到有自己动手写个主流无人驾驶汽车框架 xff08 如apollo xff09 xff08 CSDN独创 xff09 注1 xff1a 必须先看完前四章再看这一章 xff0c 如果想看得轻松请看 概率机器人 与 机器人学状态估计 完再
  • ORB_SLAM系列总结

    1 最早的特征点法 xff0c 并把定位与跟踪分为两个线程是PTAM Parallel Tracking and Mapping for Small AR Workspaces 可以说是特征点法SLAM的起源之一 论文 xff1a http
  • vmware下ubuntu18.04 安装ROS Melodic+gazebo9+PX4并roslaunch运行+QGroundConrtol控制

    官方推荐ubuntu18 04的对应ROS和gazebo版本为ROS Melodic 和 gazebo9 官方指导 xff1a ROS安装 xff1a http wiki ros org Installation Ubuntu gazebo
  • PX4自定义pkg包roslaunch

    创建pkg 首先在Ros工程目录src下 xff0c 创建新的功能包ref catkin create pkg span class token operator lt span pkg name span class token oper
  • PyTorch中FLOPs计算问题

    最近看了很多关于FLOPs计算的实现方法 xff0c 也自己尝试了一些方法 xff0c 发现最好用的还是PyTorch中的thop库 xff08 代码如下 xff09 xff1a device 61 torch device 34 cuda
  • Docker Prometheus(普罗米修斯)监控系统+grafana可视化

    目录 一 Prometheus 概述1 概述2 监控系统作用及Prometheus的特点3 Prometheus 基本服务与作用4 概念 二 Prometheus exporter cadvisor 的部署1 docker部署prometh
  • 收藏的博客 -- Qt有关的GitHub/Gitee开源项目

    收藏的博客 Qt有关的GitHub Gitee开源项目 置顶 libaineu2004 2017 08 18 14 50 30 5843 已收藏 68 分类专栏 xff1a 精品资源推荐 文章标签 xff1a qt github g
  • 【海康摄像头】海康摄像头SDK下载与使用

    文章目录 一 海康摄像头SDK官网下载二 海康摄像头SDK在WinForm WPF中使用三 常用接口函数 xff0c 封装调用函数 一 海康摄像头SDK官网下载 1 进入海康ws官网 xff0c 下载官网SDK和相关文档 2 根据自己应用程
  • 嵌入式面试知识点总结 -- STM32篇

    一 MCU对比 问题 xff1a 问题一 xff1a STM32F1和F4的区别 xff1f 解答 xff1a 参看 xff1a STM32开发 STM32初识 内核不同 xff1a F1是Cortex M3内核 xff0c F4是Cort
  • Linux递归访问文件目录

    Linux递归访问文件目录 include lt iostream gt include lt cstring gt include lt cstdlib gt include lt sys types h gt include lt di