前言
在之前的文章中,描述过如何用 fcntl 函数改变文件的状态标记。但,文件还有很多信息,如文件类型,权限设置,设备编号,访问时间等等。如果要获取这些信息,则使用函数 lstat 可以轻松达到这个目的。
下面的程序将使用该函数获取文件类型信息并判断它的类型。
但在这之前,先要说明文件信息结构体和文件类型判定宏。
文件信息结构体
调用 lstat 函数将会把指定文件的信息存放到 stat 结构体中,这个结构体的定义大致如下:
文件类型判定宏
文件结构体中的文件类型字段是一个整数,对此,可以使用如下判定宏来获知判定对象所属的文件类型:
代码示例
1 #include "apue.h" 2 3 int 4 main(int argc, char *argv[]) 5 { 6 int i; 7 struct stat buf; 8 char *ptr; 9 10 for (i = 1; i < argc; i++) { 11 // 输出要判断的文件名 12 printf("%s: ", argv[i]); 13 14 // 执行 lstat 函数后,文件的信息就存放在了结构体 buf 中。 15 if (lstat(argv[i], &buf) < 0) { 16 err_ret("lstat error"); 17 continue; 18 } 19 20 // 执行判定宏,对结构体中的文件类型变量进行判定。 21 if (S_ISREG(buf.st_mode)) 22 ptr = "regular"; 23 else if (S_ISDIR(buf.st_mode)) 24 ptr = "directory"; 25 else if (S_ISCHR(buf.st_mode)) 26 ptr = "character special"; 27 else if (S_ISBLK(buf.st_mode)) 28 ptr = "block special"; 29 else if (S_ISFIFO(buf.st_mode)) 30 ptr = "fifo"; 31 else if (S_ISLNK(buf.st_mode)) 32 ptr = "symbolic link"; 33 else if (S_ISSOCK(buf.st_mode)) 34 ptr = "socket"; 35 else 36 ptr = "** unknown mode **"; 37 printf("%s ", ptr); 38 } 39 exit(0); 40 }
运行测试
创建一个测试文件,并用该程序判断其文件类型。
小结
1. 当判定链接类型文件时,如果需要判定的对象是链接文件所链接的那个文件而非此链接文件本身的话,则应当使用 stat 函数。
2. 当希望通过文件描述符指定文件时,则应当使用 fstat 函数。