注意:与前面的
一、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;
}