1.Linux中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.Linux中文件的类型
一般有7种类型:
普通文件 目录文件 字符设备文件 块设备文件 链接文件 管道文件 Socket文件
利用lstat函数来显示不同文件类型,注意lstat与stat函数不同,stat函数不能检测出链接文件;
测试程序:
| 1 #include <stdio.h>
| 2 #include <stdlib.h>
| 3 #include <unistd.h>
| 4 #include <sys/stat.h>
| 5
| 6 int main(int argc, char **argv)
| 7 {
| 8 int i;
| 9 char *pInfo;
| 10 struct stat stBuf;
| 11
| 12 if(argc < 2)
| 13 {
| 14 printf("Usage:./test xxx xxx xxx\n");
| 15 exit(-1);
| 16 }
| 17
| 18 for(i=1; i<argc; i++)
| 19 {
| 20 printf("%s\n", argv[i]);
| 21 if(lstat(argv[i], &stBuf) < 0)
| 22 {
| 23 perror("Open File error");
| 24 continue;
| 25 }
| 26 if(S_ISREG(stBuf.st_mode))
| 27 pInfo = "Regular";
| 28 else if(S_ISDIR(stBuf.st_mode))
| 29 pInfo = "Directory";
| 30 else if(S_ISCHR(stBuf.st_mode))
| 31 pInfo = "Char special";
| 32 else if(S_ISBLK(stBuf.st_mode))
| 33 pInfo = "Block special";
| 34 else if(S_ISFIFO(stBuf.st_mode))
| 35 pInfo = "Fifo";
| 36 else if(S_ISLNK(stBuf.st_mode))
| 37 pInfo = "Link";
| 38 else if(S_ISSOCK(stBuf.st_mode))
| 39 pInfo = "Socket";
| 40 else
| 41 pInfo = "**Unknown Type**";
| 42
| 43 printf("%s file\n\n", pInfo);
| 44 }
| 45
| 46 return 0;
| 47 }
测试命令:./test test /home/ /dev/log /dev/tty /dev/sda /dev/scd0
测试结果:
test
Regular file
/home/
Directory file
/dev/log
Socket file
/dev/tty
Char special file
/dev/sda
Block special file
/dev/scd0
Link file