文件状态介绍

SylixOS中文件的状态信息包含在stat结构体中,其中包含了文件大小,设备标识符,用户标识符,用户组标识符,文件模式,扩展属性,文件读取或修改的时间戳,链接数量,指向存储该内容的磁盘区块的指针,文件分类等等。

SylixOS中维护的stat结构体如图 1.1所示。

图 1.1 stat结构体成员

文件状态获取函数文件状态获取函数介绍

SylixOS中获取文件状态可以使用stat、lstat和fstat等函数。如图 2.1所示。

图 2.1获取文件状态函数原型

函数fstat原型分析:成功返回0,失败返回-1,并设置错误号。参数iFd是文件描述符,输出参数pstat返回文件状态信息。

函数stat原型分析:成功返回0,失败返回-1,并设置错误号。参数pcName是文件名,输出参数pstat返回文件状态信息。

函数lstat原型分析:成功返回0,失败返回-1,并设置错误号。参数pcName是文件名,输出参数pstat返回文件状态信息。

stat函数类似于lstat函数,区别是当传入的文件名是符号链接时,lstat函数将获得符号链接的相关信息,而不是符号链接指向的实际的文件的信息。

目录下全文件状态获取

获取目录下所有文件的状态信息,需要涉及到对当前目录以及子目录的读写操作。

在使用opendir函数打开一个目录文件之后,使用readdir函数来获取一个已经打开目录的单条信息。所以为了获取目录下及其子目录下所有文件信息的时候,需要多次调用readdir函数来读取目录信息,readdir函数执行失败返回NULL,成功返回dirent结构体指针,dirent结构体成员如图 2.2所示。

图 2.2 dirent结构体成员

成员变量d_name保存了文件名信息,但是需要注意的是,此文件名不可以直接用作stat或lstat函数的pcName参数传入,否则调用容易失败。原因是因为d_name返回的文件名是不带路径的一个字符串,当调用stat或者lstat获取非当前目录文件的状态信息时,由于当前目录没有发生改变,传入非当前目录下的文件名则失败。所以可以通过字符拼接构造出正确的相对或者绝对路径传入stat或者lstat函数,完成对所有目录下文件状态的获取工作。

下面的程序完成了对传入的路径下所有文件状态中文件类型的打印。见程序清单 2.1。

程序清单 2.1实例代码


#include<stdio.h>#include<unistd.h>#include<fcntl.h>#include<sys/stat.h>#include<string.h>/***********************************************************************************************************函数名称:printdir**功能描述:遍历当前目录下的文件和目录并通过控制台输出显示**输 入:目录路径**输 出:**全局变量:**调用模块:*********************************************************************************************************/voidprintdir(char*path){DIR*dir=NULL;structdirent*entry=NULL;structstatstatbuf={0};dir=opendir(path);if(!dir){printf("failedtoopencurrentdirectory!\n");return;}while(1){entry=readdir(dir);if(entry==NULL){break;}else{intret=0;charpath3[50]={0};strcpy(path3,path);/**路径拼接*/strcat(path3,entry->d_name);strcat(path3,"/");ret=lstat(path3,&statbuf);if(ret){printf("err!\n");break;}if(S_ISDIR(statbuf.st_mode)){printf("Dir:%s\n",path3);/**递归调用*/printdir(path3);}else{printf("File:%s\n",path3);}}}closedir(dir);}intmain(intargc,char**argv){printdir(argv[1]);return(0);}