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.mzph.cn/news/57216.shtml

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

相关文章

【Java架构-版本控制】-Git基础

本文摘要 Git作为版本控制工具&#xff0c;使用非常广泛&#xff0c;在此咱们由浅入深&#xff0c;分三篇文章&#xff08;Git基础、Git进阶、Gitlab搭那家&#xff09;来深入学习Git 文章目录 本文摘要1.Git仓库基本概念1.1 远程仓库(Remote)1.2 本地库(Repository) 2. Git仓库…

PMAC与Modbus主站进行Modbus Tcp通讯

PMAC与Modbus主站进行Modbus Tcp通讯 创建modbus通讯参数 在项目的PMAC Script Language\Global Includes下创建一个名为00_Modbus_Para.pmh的pmh文件。 Modbus[0].Config.ServerPort 0 Modbus[0].Config.ConnectTimeOut 6000 Modbus[0].Config.SendRecvTimeOut 0 Modbu…

WPF数据绑定

数据绑定是一个很强大且优雅的技能&#xff0c;之前用过好多次&#xff0c;但有些地方总不是特别清晰&#xff0c;常常需要重新翻阅资料来回顾&#xff0c;于是这次用了几天时间好好梳理一下&#xff0c;记录一下。 首先数据绑定对数据对象的要求&#xff1a;需要是公有属性&a…

基于Visual studio创建API项目

API&#xff08;英文全称&#xff1a;Application Programming Interface,中文&#xff1a;应用程序编程接口&#xff09; 为什么要 通过API接口可以与其他软件实现数据相互通信&#xff0c;API这项技术能够提高开发效率。 本文是基于vs2017 .net平台搭建API。希望可以帮助到学…

leetcode做题笔记110. 平衡二叉树

给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 思路一&#xff1a;递归 int height(struct TreeNode* root) {if (root NULL) {return…

HBase--技术文档--基本概念--《快速扫盲》

官网 Apache HBase – Apache HBase™ Home 阿里云hbase 云数据库HBase_大数据存储_订单风控_数据库-阿里云 云数据库 HBase-阿里云帮助中心 基本概念 HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。它基于Hadoop&#xff0c;采用列式存储方式&#xff0c;可…

DPLL 算法之分裂策略

前言 DPLL算法确实是基于树&#xff08;或二叉树&#xff09;的回溯搜索算法&#xff0c;它用于解决布尔可满足性问题&#xff08;SAT问题&#xff09;。下面我会分析您提到的DPLL算法中的分裂策略&#xff0c;以及它是如何在搜索过程中起作用的。 DPLL算法中的分裂策略是用于在…

使用 Ansible 管理软件包(Yum 和 Apt )

Ansible 是一种强大而受欢迎的自动化工具&#xff0c;可用于管理和配置大规模服务器环境。在本文中&#xff0c;我们将探讨如何使用 Ansible 来管理 Yum&#xff08;适用于 CentOS、Red Hat 和 Fedora&#xff09;和 Apt&#xff08;适用于 Debian 和 Ubuntu&#xff09;软件包…

前端面试话术集锦第一篇

🚗前端面试集锦目录 💖前端面试话术集锦第一篇💖 💖前端面试话术集锦第二篇💖 文章目录 1. 前端需要注意哪些SEO2. \<img>的title和alt有什么区别3. HTTP的⼏种请求⽅法⽤途4. 从浏览器地址栏输⼊url到显示⻚⾯的步骤5. 如何进⾏⽹站性能优化6. HTTP状态码及其…

【conda install】网络慢导致报错CondaHTTPError: HTTP 000 CONNECTION FAILED for url

⭐⭐问题&#xff1a; 部署安装环境经常会出现由于网络慢问题&#xff0c;导致conda安装不了库&#xff0c;报错如下&#xff1a; Solving environment: failedCondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/…

【Spring Boot】数据库持久层框架MyBatis — Spring Boot构建MyBatis应用程序

Spring Boot构建MyBatis应用程序 Spring Boot是用于快速构建Spring应用程序的框架。MyBatis是一种Java持久化框架&#xff0c;可以帮助开发人员轻松地管理数据库。将Spring Boot与MyBatis结合使用可以使开发人员更容易地创建和管理数据库应用程序。 以下是使用Spring Boot构建…

海康威视相机-LINUX SDK 开发

硬件与环境 相机&#xff1a; MV-CS020-10GC 系统&#xff1a;UBUNTU 22.04 语言&#xff1a;C 工具&#xff1a;cmake 海康官网下载SDK 运行下面的命令进行安装 sudo dpkg -i MVSXXX.deb安装完成后从在/opt/MVS 路径下就有了相关的库&#xff0c;实际上我们开发的时候只需要…

vue实现导出excel的多种方式

在Vue中实现导出Excel有多种方式&#xff0c;可以通过前端实现&#xff0c;也可以通过前后端配合实现。下面将详细介绍几种常用的实现方式。 1. 前端实现方式&#xff1a; 使用xlsx库&#xff1a;使用xlsx库可以在前端将数据导出为Excel文件。首先需要安装xlsx库&#xff0c;…

关于c#:BindingProxy:绑定到索引属性

我有一个BindingProxy将DataGrid的DataGridColumns的可视性-属性绑定到字典中的值(" ColumnsVisibility")。我也有一个上下文菜单&#xff0c;它应该可以隐藏/显示网格的列。 <DataGrid Name"dgMachines"ItemsSource"{Binding HVMachineList,Upda…

肯德尔秩相关系数(Kendall‘s Tau)排名

肯德尔秩相关系数&#xff08;Kendall’s Tau&#xff09;是一种用于衡量两个排列之间相似性的统计指标&#xff0c;它考虑了元素之间的顺序关系而不考虑具体数值。该系数被广泛用于排序、排名和比较不同实验结果的相关性等领域。 具体而言&#xff0c;肯德尔秩相关系数衡量了…

AUTOSAR从入门到精通-【应用篇】基于嵌入式实时Linux及AUTOSAR的跨平台技术研究与实现

目录 前言 通用实时操作系统的国内外研究现状 AUTOSAR国内外研究现状 实时操作系统的选择

专业制造一体化ERP系统,专注于制造工厂生产管理信息化,可定制-亿发

制造业是国民经济的支柱产业&#xff0c;对于经济发展和竞争力至关重要。在数字化和智能化趋势的推动下&#xff0c;制造业正处于升级的关键时期。而ERP系统&#xff0c;即企业资源计划系统&#xff0c;能够将企业的各个业务环节整合起来&#xff0c;实现资源的有效管理和信息的…

攻击与防御实战经验分享:分析真实的攻击事件和入侵行为,讨论防御方法和实践经验

章节 1: 前言 作为IT领域的从业者&#xff0c;我们时刻都面临着网络安全的挑战。攻击者不断寻找漏洞&#xff0c;而防御者则需要时刻保持警惕&#xff0c;采取最佳实践来保护系统和数据。在本文中&#xff0c;我们将分享一些真实的攻击事件和入侵行为&#xff0c;并探讨针对这…

LInux之chrony服务器

目录 场景 重要性 LInux的两个时钟 硬件时钟 系统时钟 NTP协议 Chrony介绍 定义 组成 --- chronyd和chronyc 安装与配置 安装 Chrony配置文件分析 同步时间服务器 chronyc命令 chronyc sources输出分析 其它命令 查看时间服务器的状态 查看时间服务器是否在线 …

大数据技术概述(三)——编程语言的选择

文章目录 1.6编程语言的选择1.6.1java和Scala1.6.2Python1.6.3SQL 1.6编程语言的选择 大数据编程一般会使用Java、Scala和python等编程语言&#xff0c;Flink目前也支持上述3种语言。 1.6.1java和Scala Java支持多线程&#xff0c;其生态圈中可用的第三方库众多。Java虚拟机…