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

目录

  • 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 */       // 文件所在设备的IDino_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 */                   // 所有者用户IDgid_t     st_gid;     /* group ID of owner */                  // 所有者组IDdev_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.hqwc.cn/news/87361.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法专题突破】双指针 - 盛最多水的容器(4)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;Leetcode&#xff09; 这道题目也不难理解&#xff0c; 两边的柱子的盛水量是根据短的那边的柱子决定的&#xff0c; 而盛水量…

ubuntu22安装和部署Kettle8.2

前提 kettle是纯java编写的etl开源工具&#xff0c;目前kettle7和kettle8都需要java8或者以上才能正常运行。所以运行kettle前先检查java环境是否正确配置&#xff0c;java版本是否是8或者以上。 kettle安装 1、创建kettle目录&#xff0c;并将kettle的zip包解压到kettle目…

MySQL - 表空间碎片整理方法

MySQL数据库中的表在进行了多次delete、update和insert后&#xff0c;表空间会出现碎片。定期进行表空间整理&#xff0c;消除碎片可以提高访问表空间的性能。 检查表空间碎片 下面这个实验用于验证进行表空间整理后对性能的影响&#xff0c;首先检查这个有100万记录表的大小&…

【业务功能篇86】微服务-springcloud-系统性能压力测试-jmeter-性能优化-JVM参数调优

系统性能压力测试 一、压力测试 压力测试是给软件不断加压&#xff0c;强制其在极限的情况下运行&#xff0c;观察它可以运行到何种程度&#xff0c;从而发现性能缺陷&#xff0c;是通过搭建与实际环境相似的测试环境&#xff0c;通过测试程序在同一时间内或某一段时间内&…

【最强最全】视频号下载助手(支持视频号视频, 直播,回放下载)

视频号下载助手支持视频号视频, 直播,回放的下载&#xff0c;本工具基于秦天sunny中间件编写&#xff0c;无需再使用其它抓包软件&#xff0c;无需再使用其它下载软件。 当然&#xff0c;你也可以右键复制抓取后的视频源再用其它下载软件下载。 使用说明 解压文件&#xff0c;…

Matlab(结构化程式和自定义函数)

目录 1.脚本编辑器 2.脚本流 2.1 控制流 2.2 关系&#xff08;逻辑&#xff09;操作符 3.脚本与函数 1.脚本编辑器 Matlab的命名规则&#xff1a; 常用功能&#xff1a; 智能缩进&#xff1a; 在写代码的时候&#xff0c;有的时候代码看起来并不是那么美观&#xff08;可读性…

华为云Stack的学习(二)

三、华为云Stack产品组件 FunsionSphere CPS 提供云平台的基础管理和业务资源&#xff08;包括计算资源和存储资源&#xff09;。采用物理服务器方式部署在管理节点。可以做集群的配置&#xff0c;扩容和运维管理。 Service OM 提供云服务的运维能力&#xff0c;采用虚拟化方…

【数据结构大全】你想要的都有,数组、链表、堆栈、二叉树、红黑树、B树、图......

目录 1.概述 2.线性结构 3.时间复杂度 4.查找算法 5.树 6.图 1.概述 博主之前写过一个完整的关于数据结构的系列文章&#xff0c;一共十三篇&#xff0c;内容包含&#xff0c;数组、链表、堆栈、队列、时间复杂度、顺序查找、二分查找、二叉树、二叉搜索树、平衡二叉树、…

LeetCode-406-根据身高重建队列

题目描述&#xff1a; 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造…

设计模式(一)

1、适配器模式 &#xff08;1&#xff09;概述 适配器中有一个适配器包装类Adapter&#xff0c;其包装的对象为适配者Adaptee&#xff0c;适配器作用就是将客户端请求转化为调用适配者中的接口&#xff1b;当调用适配器中的方法时&#xff0c;适配器内部会调用适配者类的方法…

Node与Express后端架构:高性能的Web应用服务

在现代Web应用开发中&#xff0c;后端架构的性能和可扩展性至关重要。Node.js作为一个基于事件驱动、非阻塞I/O的平台&#xff0c;以及Express作为一个流行的Node.js框架&#xff0c;共同构建了高性能的Web应用服务。 在本文中&#xff0c;我们将深入探讨Node与Express后端架构…

Vue脚手架中安装ElementUi

目录 ElementUi简介&#xff1a; ElementUi下载&#xff1a; npm 安装&#xff1a; 引入ElementUi: 测试是否引入成功&#xff1a; Element-ui官网&#xff1a;组件 | Element ElementUi简介&#xff1a; ElementUi&#xff0c;是由国内的饿了么团队开发并开源的一套为开…