首页 > 代码库 > Linux系统编程_3_文件属性

Linux系统编程_3_文件属性

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