Linux枚举文件目录、获取文件属性

news2024/10/6 5:54:17

目录

  • 1.枚举指定路径下的文件目录
  • 2.获取文件属性stat
    • 其他方式:Linux获取文件属性stat()、fstat()、lstat()函数实现
    • stat属性
    • 代码

1.枚举指定路径下的文件目录

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>

void list_files_recursive(const char* path) {
    DIR* dir;
    struct dirent* entry;
    struct stat file_stat;

    // 打开目录
    dir = opendir(path);
    if (dir == NULL) {
        printf("Failed to open directory: %s\n", path);
        return;
    }

    // 逐个读取目录项
    while ((entry = readdir(dir)) != NULL) {
        char file_path[256];

        // 构建文件路径
        snprintf(file_path, sizeof(file_path), "%s/%s", path, entry->d_name);

        // 获取文件信息
        if (stat(file_path, &file_stat) == -1) {
            printf("Failed to get file stat: %s\n", file_path);
            continue;
        }

        // 判断是否为目录
        if (S_ISDIR(file_stat.st_mode)) {
            // 忽略 "." 和 ".." 目录
            if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
                continue;
            }

            // 递归调用自身处理子目录
            list_files_recursive(file_path);
        } else {
            // 输出文件路径
            printf("%s\n", file_path);
        }
    }

    // 关闭目录
    closedir(dir);
}

int main() {
    const char* folder_path = "/home/yxb/read"; // 替换为你的文件夹路径

    list_files_recursive(folder_path);

    return 0;
}

在这里插入图片描述

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
int main()
{
    DIR * dir;
    struct dirent * ptr;
    int i;
    dir = opendir("/home/yxb/sense");
    while((ptr = readdir(dir)) != NULL)
    {
        printf("d_name : %s\n", ptr->d_name);
    }
    closedir(dir);
}

2.获取文件属性stat

其他方式:Linux获取文件属性stat()、fstat()、lstat()函数实现

函数原型  #include <sys/stat.h>
 int stat(const char *restrict pathname, struct stat *restrict buf);
提供文件名字,获取文件对应属性。
 int fstat(int filedes, struct stat *buf);
通过文件描述符获取文件对应的属性。
 int lstat(const char *restrict pathname, struct stat *restrict buf);
类似于stat.但是当命名的文件是一个符号链接时,lstat返回该符号链接的有关信息,而不是由该符号链接引用文件
函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中返回值: 
 执行成功则返回0,失败返回-1,错误代码存于errno
 
第二个参数是个指针,它指向一个我们应提供的结构。这些函数填写由buf指向的结构。
该结构的实际定义可能所实施而有所不同,但其基本形式是:


stat属性

stat结构体

struct stat {
   dev_t     st_dev;     /* ID of device containing file */       // 文件所在设备的ID
   ino_t     st_ino;     /* inode number */                       // inode节点号
   mode_t    st_mode;    /* protection */                         // 文件对应的模式,文件、目录等
   nlink_t   st_nlink;   /* number of hard links */               // 链向此文件的连接数(硬连接)
   uid_t     st_uid;     /* user ID of owner */                   // 所有者用户ID
   gid_t     st_gid;     /* group ID of owner */                  // 所有者组ID
   dev_t     st_rdev;    /* device ID (if special file) */        // 设备号,针对设备文件
   off_t     st_size;    /* total size, in bytes */               // 文件大小,单位为字节
   blksize_t st_blksize; /* blocksize for filesystem I/O */       // 系统块的大小(文件内容对应的块大小)
   blkcnt_t  st_blocks;  /* number of 512B blocks allocated */    // 文件所占块数
   time_t    st_atime;   /* time of last access */                // 最近存取时间(最近一次访问的时间)
   time_t    st_mtime;   /* time of last modification */          // 最近修改时间
   time_t    st_ctime;   /* time of last status change */         // 文件状态改变时间(文件创建时间)
};

结构体 struct stat 中的 st_mode 属性可以用来判断指定文件为目录、普通文件、链接文件等,可以通过使用相应的宏进行判断,以下列出部分常用文件的宏,以及其使用方法。

S_ISDIR(st_mode):是否为目录
S_ISREG(st_mode):是否为常规文件
S_ISLNK(st_mode):是否为链接文件
S_ISCHR(st_mode):是否为字符设备
S_ISBLK(st_mode):是否为块设备
S_ISFIFO(st_mode):是否为FIFO文件
S_ISSOCK(st_mode):是否为SOCKET文件

代码

/* file stat example */  
  
#include <stdio.h>  
#include <unistd.h>  
#include <sys/stat.h>  
#include <sys/types.h>  
  
#include <stdlib.h>  
#include <time.h>  
  
int main(int argc, char **argv){  
  
  struct stat st;  
  
  if(argc != 2){  
    fprintf(stderr, "Usage: %s <file_pathname> \n", argv[0]);  
        exit(EXIT_FAILURE);  
    }  
  
    if(stat(argv[1], &st) == -1){  
        perror("stat");  
        exit(EXIT_SUCCESS);  
    }  
  
    printf("File type:                ");  
    switch(st.st_mode & S_IFMT){  
      case S_IFBLK:  printf("block device\n");            break;  
      case S_IFCHR:  printf("character device\n");        break;  
      case S_IFDIR:  printf("directory\n");               break;  
      case S_IFIFO:  printf("FIFO/pipe\n");               break;  
      case S_IFLNK:  printf("symlink\n");                 break;  
      case S_IFREG:  printf("regular file\n");            break;  
      case S_IFSOCK: printf("socket\n");                  break;  
      default:       printf("unknown?\n");                break;  
  }  
    
  printf("I-node number:            %ld\n", (long) st.st_ino);  
  printf("Mode:                     %lo (octal)\n", (unsigned long) st.st_mode);  
  printf("Link count:               %ld\n", (long) st.st_nlink);  
  printf("Ownership:                UID=%ld   GID=%ld\n", (long) st.st_uid, (long) st.st_gid);  
  printf("device containing file id:%ld \n", (long) st.st_dev);  
  printf("device id:                %ld \n", (long) st.st_rdev);  
  printf("File size:                %lld bytes\n", (long long) st.st_size);  
  printf("Preferred I/O block size: %ld bytes\n", (long) st.st_blksize);  
  printf("Blocks allocated:         %lld\n", (long long) st.st_blocks);  
  printf("Last status change:       %s", ctime(&st.st_ctime));  
  printf("Last file access:         %s", ctime(&st.st_atime));  
  printf("Last file modification:   %s", ctime(&st.st_mtime));  
  
  exit(EXIT_SUCCESS);  
} 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/942203.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java+springboot+mysql水电管理系统

项目介绍&#xff1a; 本系统为新版基于SpringBoot的水电管理系统&#xff1a; 使用javaspringbootmysql开发的水电费管理系统&#xff0c;系统包含超级管理员&#xff0c;系统管理员、用户角色&#xff0c;功能如下&#xff1a; 超级管理员&#xff1a;管理员管理、用户管理…

成功通过技术面试的策略:程序员必备指南

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

2023-8-28 图中点的层次(树与图的广度优先遍历)

题目链接&#xff1a;图中点的层次 #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 100010;int h[N], e[N], ne[N], idx; int n, m; int q[N], d[N];void add(int a, int b) {e[idx] b, ne[idx] h[a], h…

小蜗语音工具1.9、文本,小说,字幕生成语音、多角色对话,语音识别、读取音频字幕

小蜗语音免费工具 一、文本转字幕文本内容和TXT文件 二、文本转语音1、文本内容生成语音2、字幕生成语音3、多角色对话4、选择文件5、批量处理 三、语音识别、音频MP31、语音识别2、下载模型下载地址 一、文本转字幕 可以把正本小说&#xff0c;生成字幕文件。不限制文件的大小…

Exchange-CVE-2020-0688(RCE)

漏洞描述 当攻击者通过各种手段获得一个可以访问Exchange Control Panel &#xff08;ECP&#xff09;组件的用户账号密码&#xff0c;就可以在被攻击的exchange上执行任意代码&#xff0c;直接获取服务器权限。 CVE-2020-0688也是因为viewstate反序列化 漏洞版本 利用条件&…

雅思听力考点词 积累

目录 雅思听力4个部分 雅思听力答题策略 雅思听力12大场景词汇 1 求职 2 图书馆 3 生活 4 天气地形 5 医疗 6 旅游 7 住宿 8 入学 9 运动 10 环境 11 教育 12 音乐 雅思听力 Part 1 4.1 听力Part 1主要内容 4.2 听力Part 1主要题型&#xff1a;Form Completi…

jq插件:jqgrid和validform的二次封装

做久了vue和react框架项目&#xff0c;偶尔也需要做做原生的项目。不可否认vue的双向绑定机制确实很香&#xff0c;但是也是建立在原生js基础上。所以&#xff0c;只有做更多的原生js项目&#xff0c;才能更加了解vue框架的底层原理。在日常开发中&#xff0c;也会不可避免的会…

element-ui 弹窗里面嵌套弹窗,解决第二个弹窗被遮罩层掩盖无法显示的问题

当我们在 element-ui 中使用弹窗嵌套弹窗时&#xff0c;会出现第二个弹窗打开时被一个遮罩层挡着&#xff0c;就像下面这样&#xff1a; 下面提供两种解决方案 &#xff1a; 一、第一种方案 我们查询element-ui 官网可以发现 el-dialog 有这样几个属性&#xff1a; 具体使用就…

【C语言基础】const关键词的使用方法

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

App卡帧与BlockCanary

作者&#xff1a;图个喜庆 一&#xff0c;前言 app卡帧一直是性能优化的一个重要方面&#xff0c;虽然现在手机硬件性能越来越高&#xff0c;明显的卡帧现象越来越少&#xff0c;但是了解卡帧相关的知识还是非常有必要的。 本文分两部分从app卡帧的原理出发&#xff0c;讨论屏…

《Flink学习笔记》——第六章 Flink的时间和窗口

6.1 时间语义 6.1.1 Flink中的时间语义 对于一台机器而言&#xff0c;时间就是系统时间。但是Flink是一个分布式处理系统&#xff0c;多台机器“各自为政”&#xff0c;没有统一的时钟&#xff0c;各自有各自的系统时间。而对于并行的子任务来说&#xff0c;在不同的节点&…

mysql 8 jdbc连接报错:Caused by: java.sql.SOLNonTransientConnectionException: Cannot load connection clas

问题现象&#xff1a;如下图所示&#xff1a; 错误信息为&#xff1a; Caused by: java.sql.SOLNonTransientConnectionException: Cannot load connection class because of underlying exception: com.mysql.cj.e 32 xceptions.WrongArgumentException: Malformed database …

高亮img、pdf重点部分(html2canvas、pdfjs-dist、react-pdf)

可用业务场景 报销单据审批中&#xff0c;高亮发票部分 需求 后台返回一张图片或者pdf、返回一组坐标&#xff0c;坐标类型[number,number,number,number]&#xff0c;分别代表了x、y、width、height。需要根据坐标在图片上高亮出来坐标位置。如下图 高亮的坐标是&#xff1…

java-便签

--其实最痛的。不是离别。而是离别后的那些回忆。 java length( ) javalength中文占多长 1.一个中文字符或符号 2 个字节&#xff0c;一个英文字符或符号 1 个字节。 System.out.println("abc你好&#xff0c;".getBytes("gbk").length); System.out.pr…

Nuxt 菜鸟入门学习笔记四:静态资源

文章目录 public 目录assets 目录全局样式导入 Nuxt 官网地址&#xff1a; https://nuxt.com/ Nuxt 使用以下两个目录来处理 CSS、fonts 和图片等静态资源&#xff1a; public 目录 public 目录用作静态资产的公共服务器&#xff0c;可通过应用程序定义的 URL 公开获取。 换…

nvm安装及使用说明

1.说明&#xff1a; nvm 一个nodejs版本管理工具&#xff01; 2.官网&#xff1a;https://nvm.uihtm.com/ 3.卸载node.js&#xff08;没安装的话忽略&#xff09; 4.下载 链接&#xff1a;https://nvm.uihtm.com/nvm-1.1.10-setup.zip 5.nvm安装 卸载之前的node后安装nvm…

<C++> SSE指令集

SSE指令集 include库 #include <mmintrin.h> //MMX #include <xmmintrin.h> //SSE(include mmintrin.h) #include <emmintrin.h> //SSE2(include xmmintrin.h) #include <pmmintrin.h> //SSE3(include emmintrin.h) #include <tmmintrin.h> /…

外部库/lib/maven依赖项 三者关系

外部库(存放项目初始配置的jar包)(它的文件夹里并没有包含lib文件夹的引的外部的依赖的jar包) lib(存放外部导入到项目的依赖的jar包) maven依赖项(管理项目所有的jar包依赖) 三者存放jar包的关系 项目所依赖的全部的jar包 maven依赖项的jar包 外部库中的jar包 lib中的…

基于STM32的酒精浓度检测报警防酒驾仿真设计(仿真+程序+讲解视频)

基于STM32的酒精浓度检测报警防酒驾仿真设计 讲解视频1.主要功能2.仿真3. 程序4. 资料清单&下载链接 基于STM32的酒精浓度检测报警防酒驾仿真设计(仿真程序讲解&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&#…

Oracle创建控制列表ACL(Access Control List)

Oracle创建控制列表ACL&#xff08;Access Control List&#xff09; Oracle ACL简介一、先登陆163邮箱设置开启SMTP。二、Oracle ACL控制列表处理&#xff08;一&#xff09;创建ACL&#xff08;create_acl&#xff09;&#xff08;二&#xff09;添加ACL权限&#xff08;add_…