Linux中的 文件属性获取 以及 目录操作

本文深入探讨了Linux系统中文件属性的获取方法,通过stat函数解析文件信息,并介绍了目录的内部结构及如何使用opendir、readdir和closedir函数进行目录操作。文章提供了实际代码示例,展示了如何遍历目录并获取文件属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:与前面的

一、Linux中的文件属性获取

首先先了解一下Linux中存放 文件属性 的结构体:

接下来再来了解一下对应的Linux中系统提供的对应获取文件信息的接口函数:(在linux中可以使用 man 2 stat查看详细手册)


头文件:

  • #include <sys/types.h>
  • #include <sys/stat.h>
  • #include <unistd.h>

接口函数:

  • int stat(const char *path, struct stat *buf); 

参数解析:

  • 参数一、文件的路径
  • 参数二、对应存放的结构体变量的地址

返回值:

  • 成功:返回 0
  • 失败:返回 -1

使用的一般步骤:

  • 因为文件属性是用 struct stat 这种结构体类型来存放的所以首先要定义一个这种结构体变量来存放获取到的文件属性
  • 接着使用  stat(路径,对应的struct stat 变量地址)
  • 常常与目录操作搭配使用,来循环获取目录下文件的信息

二、目录操作

首先先了解一下Linux中的目录: linux中的目录就是有一组文件名 和 索引号 组成的索引表,目录下的文件的真正内容存储在分区中的数据域区域。目录中索引表的每一项被称为  目录项,里面最少存放了一个文件的名字(不包含路径部分)和索引号(分区唯一)

访问一个文件的过程:

  • 根据所在目录的 索引表的名字 ---> 索引号 ---->分区i-node节点域找到对应的文件 i 节点 ---->数据域的文件
  • 如图所示

接下来了解一下存放目录内容信息的 目录结构体 :

接下来再来了解一下对应Linux中对应操作目录的函数:(在linux中可以使用man 3 readdir 、man 3 opendir 、man 3 closedir查看)


打开目录


头文件:

  • #include <dirent.h>

函数接口:

  • DIR *opendir(const char *name);

参数:

  • 路径名字

返回值:

  • 成功:返回DIR 类型的指针
  • 失败:返回NULL

读取目录


函数接口:

  • struct dirent *readdir(DIR *dirp);

参数:

  • DIR 类型的指针

返回值:

  • 成功:返回struct dirent 类型的指针
  • 失败:返回NULL

三、目录操作与文件属性获取的常见代码

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#include <dirent.h>

#define SIZE 100

int main(int argc, char const *argv[])
{
	/*第一步,初始化目录指针,打开要打开目录路径*/
	DIR *dir_p = opendir(argv[1]);//这里要打开的目录的路径
	if(dir_p == NULL)
	{
		printf("dir_p point to NULL\n");
		return -1;
	}

	/*第二步,初始化目录类型变量,循环读取目录下的文件信息*/
	struct dirent *dir;
	char fileName[SIZE];
	while(dir = readdir(dir_p))
	{
		/*第三步,获取文件名字,判断文件类型*/
		sprintf(fileName,"%s/%s",argv[1],dir->d_name);//获取文件名字的绝对路径

		//获取文件属性
		struct stat st;
		int ret = stat(fileName, &st);
		if(ret == -1) 
		{
			printf("stat file failed\n");
			return -1;
		}

		//判断文件类型:
		//方法一:掩码方式
		if((st.st_mode & S_IFMT) == S_IFREG)//判断是否普通文件
		{
			/*各种操作*/
		}

		//方法二:宏定义
		if (S_ISREG(st.st_mode))
		{
			/*各种操作*/
		}

		bzero(fileName,SIZE);
	}

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃鱼的猫丿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值