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;     //连到该文件的硬连接数目,刚建立的文件值为1
    uid_t         st_uid;       //用户ID
    gid_t         st_gid;       //组ID
    dev_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. 总结

本文介绍了文件目录以及文件属性相关函数,并通过代码练习实现了目录和文件属性获取。

 

          

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day04-MQ

1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;但是你…

数组--有序数组的平方

LeetCode中的第977题&#xff1a; 思想&#xff1a;①返回每个新数组&#xff1b;②排序&#xff1b; &#xff08;n个数&#xff0c;进行n-1趟比较。第j趟比较中要进行n-j次两两比较&#xff09; &#xff08;1&#xff09;n个数&#xff0c;进行n-1趟比较&#xff1a; for(…

深度学习【向量化(array)】

为什么要向量化 在深度学习安全领域、深度学习练习中&#xff0c;你经常发现在训练大量数据时&#xff0c;深度学习算法表现才更加优越&#xff0c;所以你的代码运行的非常快至关重要&#xff0c;否则&#xff0c;你将要等待非常长的时间去得到结果。所以在深度学习领域向量化…

(源码+部署+讲解)基于Spring Boot和Vue的宠物领养系统的设计与实现

一、引言 本报告旨在详细描述基于Spring Boot后端框架和Vue前端框架的宠物领养系统的设计与实现过程。宠物领养系统旨在为宠物主人和领养者提供一个便捷的平台&#xff0c;实现宠物的信息发布、领养申请、信息管理等功能。通过该系统&#xff0c;宠物主人可以快速找到适合的领养…

Kali WSL2(windows下安装了kali)

自从WSL2以来&#xff0c;感觉各方面也挺好的&#xff0c;有时候比vmware workstation方便&#xff0c;特别单独使用一个linux的时候。所以研究了下kali&#xff0c;也是很OK的&#xff0c;以及验证完成了。 本文参考官网&#xff1a; Kali Linux | Penetration Testing and Et…

C++——特殊类设计

目录 前言 一&#xff0c;请设计一个不能被拷贝的类 二&#xff0c;请设计一个只能在堆上创建对象的类 2.1 思路一&#xff1a;构造函数私有 2.2 思路二&#xff0c;析构函数私有 三&#xff0c;请设计一个只能在栈上创建对象的类 四&#xff0c;请设计一个只能创建一个…

练习14 Web [极客大挑战 2019]Upload

phtml格式绕过&#xff0c;burp修改content-type绕过&#xff0c;常见的文件上传存放目录名 题目就叫upload&#xff0c;打开靶机 直接上传一个图片格式的一句话木马&#xff0c;返回如下&#xff1a; 提交练习5和9中的两种可以执行图片格式php代码的文件&#xff0c;修改con…

Netty的线程模型

文章目录 前言NIO的三种reactor模式Netty对3种Reactor模式的支持Netty内部如何实现Reactor线程模型在事件分发过程中&#xff0c;Netty如何避免竞争条件 前言 Netty的线程模型采用了Reactor模式&#xff0c;这是一种高性能的IO设计模式&#xff0c;它基于NIO多路复用。Netty支…

226.翻转二叉树

226.翻转二叉树 力扣题目链接(opens new window) 翻转一棵二叉树。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNo…

Linux操作系统之防火墙、redis安装

目录 一、防火墙 1、防火墙的类别 2、安装iptables(四表五链&#xff09; 一、防火墙 1、防火墙的类别 安全产品 杀毒 针对病毒&#xff0c;特征篡改系统中文件杀毒软件针对处理病毒程序 防火墙 针对木马&#xff0c;特征系统窃密 防火墙针对处理木马 防火墙分为两种 硬件…

MySql 实战大数据查询-(表分区实现)

一 mysql分区&#xff1a; 分区是将单个表按照某种规则划分成多个子集&#xff0c;每个子集称为一个分区。常见的分区策略包括按照时间范围、范围值、列表等进行分区。 优点&#xff1a; 查询性能更好&#xff0c;涉及分区键的查询&#xff0c;数据库引擎可以只扫描特定分区&…

【MySQL】聚合函数和分组聚合

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习计网、mysql和算法 ✈️专栏&#xff1a;MySQL学习 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac…

Qt+OpenGL_part1

OpenGL&#xff0c;Qt实现&#xff1a;1入门篇(已更完)_哔哩哔哩_bilibili OpenGL3.3以上是现代模式&#xff08;可编程管线&#xff09;&#xff1a; 状态机 状态设置函数&#xff08;State-changing Function) 状态应用函数 &#xff08;State-using Function) OpenGL的状态…

人脸表情识别——数据集分享(内含处理过的AffectNet数据集)

前言&#xff1a; 最近终于是把第一篇论文发出去了&#xff0c;半年前我还挣扎在复现不出来论文的精度之中&#xff0c;这里指的是AffectNet和FERPlus这俩个数据集精度复现不出来&#xff0c;Raf-db数据集是可以复现出精度的。 接下来说重点&#xff1a;之前之所以另外两个数据…

【动手学深度学习】深入浅出深度学习之RMSProp算法的设计与实现

目录 &#x1f31e;一、实验目的 &#x1f31e;二、实验准备 &#x1f31e;三、实验内容 &#x1f33c;1. 认识RMSProp算法 &#x1f33c;2. 在optimizer_compare_naive.py中加入RMSProp &#x1f33c;3. 在optimizer_compare_mnist.py中加入RMSProp &#x1f33c;4. 问…

MacOS - brew 和 brew cask 有什么区别?

brew 是 ruby 的包管理&#xff0c;后来看 yangzhiping 的博客介绍了 brew cask&#xff0c;感觉 cask 是更好的关联关系管理&#xff0c;但是&#xff0c;我后来使用过程中&#xff0c;发现很多软件 brew cask 里没有&#xff0c;但是 brew 里面倒是挺多&#xff01;今天来给说…

电梯轿厢内电动车数据集,VOC标签格式已标注(数据集+训练好的权重)

本数据集用于电梯禁入电动车项目的目标检测算法模型训练任务。 共有4000张左右图片&#xff0c;全部为电梯监控真实照片&#xff0c;没有网络爬虫滥竽充数的图片&#xff0c;并已经分好数据集和验证集&#xff0c;可直接用来训练。以上图片均一一手工标注&#xff0c;标签格式为…

深入浅出 -- 系统架构之分布式架构

​​​​​​分布式架构&#xff1a; 根据业务功能对系统做拆分&#xff0c;每个业务功能模块作为独立项目开发&#xff0c;称为一个服务。 当垂直应用越来越多时&#xff0c;应用之间的交互不可避免&#xff0c;可将共用的基础服务或核心模块抽取出来作为独立服务&#xff0c…

golang 和java对比的优劣势

Golang&#xff08;或称Go&#xff09;和Java都是非常流行的编程语言&#xff0c;被广泛应用于各种领域的软件开发。尽管它们都是高级编程语言&#xff0c;但它们具有许多不同的特性和适用场景。本文将重点比较Golang和Java&#xff0c;探讨它们的优势和劣势。 性能方面&#…

java数据结构与算法刷题-----LeetCode504. 七进制数

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 倒退迭代&#xff08;除基取余法&#xff09;2. 省略掉反转操…