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递归访问文件目录 的相关文章

随机推荐

  • 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