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.rhkb.cn/news/115461.html

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

相关文章

C++11——右值引用和移动语义

✅<1>主页&#xff1a;&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C11——右值引用 ☂️<3>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<4>前言&#xff1a;右值引用&#xff0c;是C11更新的一个非常有价值的语法&am…

[ES]mac安装es、kibana、ik分词器

一、安装es和kibana 1、创建一个网络&#xff0c;网络内的框架(eskibana)互联 docker network create es-net 2、下载es和kibana docker pull elasticsearch:7.12.1 docker pull kibana:7.12.1 3、运行docker命令部署单点eskibana&#xff08;用来操作es&#xff09; doc…

七、高并发内存池--Page Cache

七、高并发内存池–Page Cache 7.1 PageCache的工作原理 PageCache是以span的大小(以页为单位)和下标一一对应为映射关系的哈希桶&#xff0c;下标是几就说明这个哈希桶下挂的span的大小就是几页的&#xff0c;是绝对映射的关系。因为PageCache也是全局只有唯一一个的&#x…

Unity MonoBehaviour事件函数的生命周期

Unity运行时候的默认的几个函数的执行顺序&#xff1a; 首先是Awake&#xff0c;OnEnable&#xff0c;Start等&#xff0c;后面是FixUpdate Update 最后是OnDisable、OnDestroy

VUE之jspreadsheet电子excel表格实时动态高度设置

问题&#xff1a;excel电子表格在不同屏幕大小下横向滚动条会被遮挡 排查原因&#xff1a;由于excel高度固定导致 解决方法&#xff1a;设计页面较多&#xff0c;所以封装公共方法 步骤&#xff1a; 1.使用混入封装动态设置excel高度方法&#xff1a; const mixinJexcel …

WPF实战项目十四(API篇):登录注册接口

1、新建UserDto.cs public class UserDto : BaseDto{private string userName;/// <summary>/// 用户名/// </summary>public string UserName{get { return userName; }set { userName value;OnPropertyChanged(); }}private string account;/// <summary>…

基于侏儒猫鼬算法优化的BP神经网络(预测应用) - 附代码

基于侏儒猫鼬算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于侏儒猫鼬算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.侏儒猫鼬优化BP神经网络2.1 BP神经网络参数设置2.2 侏儒猫鼬算法应用 4.测试结果&#xff1a;5…

如何让qt tableView每个item中个别字用不同颜色显示?

如何让qt tableView每个item中个别字用不同颜色显示&#xff1f; 从上面图片可以看到&#xff0c;Item为红色&#xff0c;数字5为黑色。 要实现在一个控件实现不同颜色&#xff0c;目前想到的只有QTextEdit 、QLabel。有两种方法&#xff0c;第一种是代理&#xff0c;第二种是…

李宏毅 2022机器学习 HW2 strong baseline 上分路线

strong baseline上分路线 baseline增加concat_nframes &#xff08;提升明显&#xff09;增加batchnormalization 和 dropout增加hidden layer宽度至512 &#xff08;提升明显&#xff09; 提交文件命名规则为 prediction_{concat_nframes}[{n_hidden_layers}{dropout}_bn].c…

vue自定义键盘

<template><div class"mark" click"isOver"></div><div class"mycar"><div class"mycar_list"><div class"mycar_list_con"><p class"mycar_list_p">车牌号</p>…

Flutter实现StackView

1.让界面之间可以嵌套且执行动画。 2.界面的添加遵循先进后出原则。 3.需要使用AnimateView&#xff0c;请看我上一篇博客。 演示&#xff1a; 代码&#xff1a; Stack: import package:flutter/cupertino.dart;///栈&#xff0c;先进后出 class KqWidgetStack {final Lis…

敏捷开发要点

敏捷开发是一种以人为核心&#xff0c;迭代、增量式的软件开发方法。它强调团队成员的自我管理、面对变化时的快速适应能力&#xff0c;以及持续的沟通和协作。 以下是敏捷开发的几个要点&#xff1a; 敏捷宣言&#xff1a;敏捷开发遵循敏捷宣言&#xff0c;其中包括四个价值声…

Power BI 连接 MySQL 数据库

Power Query 或 Power BI 只提供了对 SQL Server 的直接连接&#xff0c;而不支持其它数据库的直连。所以第一次连接 MySQL 数据库时&#xff0c;就出现下面的错误信。 这就需要我们自己去安装一个连接器组件。https://downloads.mysql.com/archives/c-net/ 错误解决方案 我一…

LNMP 平台搭建(四十)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 搭建LNMP 一、安装Nginx 二、安装Mysql 三、安装PHP 四、部署应用 前言 LNMP平台指的是将Linux、Nginx、MySQL和PHP&#xff08;或者其他的编程语言&#xff0c;如…

现浇钢筋混泥土楼板施工岗前安全VR实训更安全高效

建筑行业天天与钢筋混凝土砼在&#xff0c;安全施工便成了企业发展的头等大事。 当今社会&#xff0c;人人都奉行生命无价&#xff0c;安全至上。可工地安全事故频繁发生&#xff0c;吞噬掉多少宝贵生命。破坏了多小个家庭?痛定死痛&#xff0c;为了提高施工人员的安全意识。 …

软考:中级软件设计师:数据库恢复与备份,故障与恢复,反规范化

软考&#xff1a;中级软件设计师:数据库恢复与备份 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是需要细心准备…

ubuntu学习(五)----读取文件以及光标的移动

1、读取文件函数原型介绍 ssize_t read(int fd,void*buf,size_t count) 参数说明&#xff1a; fd: 是文件描述符 buf:为读出数据的缓冲区&#xff1b; count: 为每次读取的字节数&#xff08;是请求读取的字节数&#xff0c;读上来的数据保存在缓冲区buf中&#xff0c;同时文…

C++设计模式_02_面向对象设计原则

文章目录 1. 面向对象设计&#xff0c;为什么&#xff1f;2. 重新认识面向对象3. 面向对象设计原则3.1 依赖倒置原则(DIP)3.2 开放封闭原则(OCP )3.3 单一职责原则( SRP )3.4 Liskov 替换原则 ( LSP )3.5 接口隔离原则 ( ISP )3.6 优先使用对象组合&#xff0c;而不是类继承3.7…

从零学算法(剑指 Offer 36)

123.输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 为了让您更好地理解问题&#xff0c;以下面的二叉搜索树为例&#xff1a; 我们希望将这个二叉搜索树转化为双向循环链表。…

Windows-docker集成SRS服务器的部署和使用

Windows-docker集成SRS服务器的部署和使用 一、Windows Docker安装 Docker Desktop 官方下载地址&#xff1a; https://docs.docker.com/desktop/install/windows-install/ 下载windows版本的就可以了。 注意&#xff1a;此方法仅适用于 Windows 10 操作系统专业版、企业版、…