Linux文件IO(4):目录操作和文件属性获取
目录
1. 前言
2. 函数介绍
2.1 访问目录 – opendir
2.2 访问目录 – readdir
2.3 访问目录 – closedir
2.4 修改文件访问权限 – chmod/fchmod
2.5 获取文件属性 – stat/lstat/fstat
2.5.1 文件属性 – struct stat
2.6 文件类型 – st_mode
3. 代码练习
3.1 要求
3.2 代码实现
3.2.1 依赖库文件
3.2.2 声明子函数
3.2.3 实现子函数
3.2.4 main函数实现
5. 总结
1. 前言
本文通过介绍文件目录以及文件属性相关函数进行目录操作和文件属性获取。
2. 函数介绍
2.1 访问目录 – opendir
opendir函数用来打开一个目录文件:
#include <dirent.h>DIR *opendir(const char *name);DIR *fdopendir(int fd); 使用文件描述符,要配合open函数使用
- DIR是用来描述一个打开的目录文件的结构体类型
- 成功时返回目录流指针;出错时返回NULL
2.2 访问目录 – readdir
readdir函数用来读取目录流中的内容:
#include <dirent.h>struct dirent *readdir(DIR *dirp);
- struct dirent是用来描述目录流中一个目录项的结构体类型
- 包含成员char d_name[256] 参考帮助文档
- 成功时返回目录流dirp中下一个目录项;
- 出错或到末尾时时返回NULL
2.3 访问目录 – closedir
closedir函数用来关闭一个目录文件:
#include <dirent.h>int closedir(DIR *dirp);
- 成功时返回0;出错时返回EOF
2.4 修改文件访问权限 – chmod/fchmod
chmod/fchmod函数用来修改文件的访问权限:
#include <sys/stat.h>int chmod(const char *path, mode_t mode);int fchmod(int fd, mode_t mode);
- 成功时返回0;出错时返回EOF
- root和文件所有者能修改文件的访问权限
- 示例: chmod(“test.txt”, 0666);
2.5 获取文件属性 – stat/lstat/fstat
stat/lstat/fstat函数用来获取文件属性:
#include <sys/stat.h>int stat(const char *path, struct stat *buf);int lstat(const char *path, struct stat *buf);int fstat(int fd, struct stat *buf);
- 成功时返回0;出错时返回EOF
- 如果path是符号链接stat获取的是目标文件的属性;而lstat获取的是链接文件的属性
2.5.1 文件属性 – struct stat
struct stat是存放文件属性的结构体类型:
struct stat {dev_t st_dev; //文件的设备编号ino_t st_ino; //节点mode_t st_mode; //文件的类型和存取的权限nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1uid_t st_uid; //用户IDgid_t st_gid; //组IDdev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号off_t st_size; //文件字节数(文件大小)unsigned long st_blksize; //块大小(文件系统的I/O 缓冲区大小)unsigned long st_blocks; //块数time_t st_atime; //最后一次访问时间time_t st_mtime; //最后一次修改时间time_t st_ctime; //最后一次改变时间(指属性)
};
2.6 文件类型 – st_mode
通过系统提供的宏来判断文件类型:
| S_ISREG(st_mode) | 是否常规文件 |
| S_ISDIR(st_mode) | 是否目录 |
| S_ISCHR(st_mode) | 是否字符设备 |
| S_ISBLK(st_mode) | 是否块设备 |
| S_ISFIFO(st_mode) | 是否FIFO文件 |
| S_ISLNK(st_mode) | 是否链接文件 |
| S_ISSOCK(st_mode) | 是否SOCKET文件 |
通过系统提供的宏来获取文件访问权限:
| S_IRUSR | 所有者有读权限 |
| S_IWUSR | 所有者拥有写权限 |
| S_IXUSR | 所有者拥有执行权限 |
| S_IRGRP | 群组拥有读权限 |
| S_IWGRP | 群组拥有写权限 |
| S_IXGRP | 群组拥有执行权限 |
| S_IROTH | 其他用户拥有读权限 |
| S_IWOTH | 其他用户拥有写权限 |
| S_IXOTH | 其他用户拥有执行权限 |
3. 代码练习
3.1 要求
遍历一个文件夹下所有文件,并打印文件大小和日期
3.2 代码实现
3.2.1 依赖库文件
#include <dirent.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
3.2.2 声明子函数
void ReadDir(DIR* dp);
3.2.3 实现子函数
若读到的目录项为"."或".."则跳过;
判定是否为常规文件,若是,则打印文件大小和日期。
注意:这里的stat若打开除程序允许目录的其他文件夹中的文件,其中path变量不能只是当前目录下的文件名,那样会出现未找到文件或者目录的错误,应该是文件的绝对路径。
void ReadDir(DIR* dp)
{struct dirent *dt;int ret;while((dt = readdir(dp))!=NULL){struct stat buf;if((strcmp(dt->d_name,"..")!=0)&&(strcmp(dt->d_name,".")!=0)){printf("%s",dt->d_name);}ret = stat(dt->d_name,&buf);if(ret<0){perror("stat");return;}if(S_ISREG(buf.st_mode)){printf(" %d",(int)buf.st_size);struct tm* t;t = localtime(&buf.st_ctime);printf(" %d-%d-%d %d:%d\n",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min);}else{printf("\n");}}return;
}
3.2.4 main函数实现
int main(int argc,char* argv[])
{DIR* dp;struct dirent *dt;dp = opendir("/home/linux/Lv5/Day9/");if(dp == NULL){perror("opendir");return 0;}ReadDir(dp);closedir(dp);return 0;
}
4. 测试

5. 总结
本文介绍了文件目录以及文件属性相关函数,并通过代码练习实现了目录和文件属性获取。
相关文章:
Linux文件IO(4):目录操作和文件属性获取
目录 1. 前言 2. 函数介绍 2.1 访问目录 – opendir 2.2 访问目录 – readdir 2.3 访问目录 – closedir 2.4 修改文件访问权限 – chmod/fchmod 2.5 获取文件属性 – stat/lstat/fstat 2.5.1 文件属性 – struct stat 2.6 文件类型 – st_mode 3. 代码练习 3.1 要求 3.2 代…...
【C语言】_文件类型,结束判定与文件缓冲区
目录 1. 文本文件和二进制文件 2. 文件读取结束的判定 3. 文件缓冲区 1. 文本文件和二进制文件 根据数据的组织形式,数据文件被称为文本文件或二进制文件; 数据在内存中以二进制的形式存储,如果不加转换地输出到外存,就是二进…...
YOLOV8注意力改进方法:DoubleAttention(附代码)
原论文地址:原论文地址 DoubleAttention网络结构的优点在于,它能够有效地捕获图像中不同位置和不同特征的重要性,从而提高了图像识别和分割的性能。 论文相关内容介绍: 论文摘要:学习捕捉远程关系是图像/视频识别的…...
每日一题 --- 前 K 个高频元素[力扣][Go]
前 K 个高频元素 题目:347. 前 K 个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: …...
Rust所有权和Move关键字使用和含义讲解,以及Arc和Mutex使用
Rust 所有权规则 一个值只能被一个变量所拥有,这个变量被称为所有者。 一个值同一时刻只能有一个所有者,也就是说不能有两个变量拥有相同的值。所以对应变量赋值、参数传递、函数返回等行为,旧的所有者会把值的所有权转移给新的所有者&#…...
【YOLOV5 入门】——构建自己的数据集模型训练模型检验
一、准备工作 1、数据收集 图片类型数据不用多说;视频类型数据利用opencv进行抽帧保存为一张张图片,这里选取30s的名侦探柯南片段进行试验,确保环境解释器下安装了opencv(我使用的是另一个虚拟环境): im…...
MacBook 访达使用技巧【mac 入门】
快捷键 打开访达搜索窗口默认快捷键【⌥ ⌘ 空格键】可以在键盘【系统偏好设置 -> 键盘->快捷键->聚焦】修改 但是我不会去修改它,因为我不常用访达的搜索窗口,更多的是想快速打开访达文件夹窗口,可以通过第三方软件定义访达的快…...
常见溯源,反溯源,判断蜜罐手段
常见溯源,反溯源,判断蜜罐手段 1.溯源手段2.反溯源手段3.如何判断蜜罐🍯4.案例:MySQL读文件蜜罐 1.溯源手段 IP地址追踪:通过IP地址追踪可以确定攻击者的地理位置和ISP信息等;通过攻击IP历史解析记录/域名…...
蓝桥杯刷题-09-三国游戏-贪心⭐⭐⭐
蓝桥杯2023年第十四届省赛真题-三国游戏 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i 个事件发生时会分别让 X, Y,…...
Windows编译运行TensorRT-YOLOv9 (C++)
Windows编译运行yolov9-bytetrack-tensorrt(C) 1 基础环境2 编译yolov9-bytetrack-tensorrt(1)下载yolov9-bytetrack-tensorrt源码(2)修改CMakeLists.txt(3)CMake编译 3 yolov9模型转…...
.NET 设计模式—简单工厂(Simple Factory Pattern)
简介 简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过一个工厂类来创建对象,根据不同的参数或条件返回相应的对象实例。这种模式隐藏…...
聊聊Linux内核中内存模型
介绍 在Linux中二进制的程序从磁盘加载到内存,运行起来后用户态是使用pid来唯一标识进程,对于内核都是以task_struct表示。二进制程序中的数据段、代码段、堆都能提现在task_struct中。每一个进程都有自己的虚拟地址空间,虚拟地址空间包含几…...
docker自动化部署示例
前提 安装docker 、 docker-cpmpose、git、打包环境(如meaven、jdk、node等) 原理 git Dockerfile docker-compose 获取源码(代码仓库)获取可运行程序的镜像(docker)将打包后的程序放入镜像内…...
Redis精品案例解析:Redis实现持久化主要有两种方式
Redis实现持久化主要有两种方式:RDB(Redis DataBase)和AOF(Append Only File)。这两种方式各有优缺点,适用于不同的使用场景。 1. RDB持久化 RDB持久化是通过创建一个二进制的dump文件来保存当前Redis数据…...
Python | Leetcode Python题解之第14题最长公共前缀
题目: 题解: class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:def isCommonPrefix(length):str0, count strs[0][:length], len(strs)return all(strs[i][:length] str0 for i in range(1, count))if not strs:return &quo…...
烧坏两块单片机,不知道原因?
没有看你的原理图,以下是造成烧毁芯片的几个环节: 1. 最大的可能性是你的单片机电机控制输出与电机驱动电路没有隔离。 我的经验,使用STM32控制电机,无论是直流电机脉宽调制,还是步进电机控制,控制电路与…...
SV学习笔记(八)
文章目录 SV入门练习基本数据类型字符串类型数组类型接口的定义与例化类的封装类的继承package的使用随机约束线程的同步线程的控制虚方法方法(任务与函数)SV用于设计 参考资料 SV入门练习 基本数据类型 有符号无符号、四状态双状态、枚举类型、结构体…...
Java反射常用方法
反射 作用: 对于任意一个对象,把对象所有的字段名和值,保存到文件中去利用反射动态的创造对象和运行方法 1. 获取字节码文件对象 方法描述Class.forName(String)通过类的全限定名字符串获取字节码文件对象。类字面量直接使用类的字面量获…...
go语言实现无头单向链表
什么是无头单向链表 无头单向链表是一种线性数据结构,它的每个元素都是一个节点,每个节点都有一个指向下一个节点的指针。"无头"意味着这个链表没有一个特殊的头节点,链表的第一个节点就是链表的头。 优点: 动态大小&…...
SpringBoot快速入门笔记(5)
文章目录 一、elemetnUI1、main.js2、App.vue3、fontAwesome 一、elemetnUI 开源前端框架,安装 npm i element-ui -S 建议查看官方文档 Element组件,这里是Vue2搭配elementUI,如果是vue3就搭配elementPlus,这里初学就以Vue2为例子…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
