1、stat主要函数
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf);
//在Linux中,可以利用stat()函数来获取一个文件的状态
//这个函数执行成功返回0,失败返回-1
//取得的文件状态存放在buf指针指向的struct stat结构提中
int fstat(int fd, struct stat *buf);
//fstat函数获得已在描述符上打开的文件的有关信息
int lstat(const char *path, struct stat *buf);
//lstat函数类似于stat,但是当命名的文件是一个符号连接时
// lstat返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息
2、认识stat结构体
struct stat {
dev_t st_dev; /* 文件的设备编号 */
ino_t st_ino; /* inode number */
mode_t st_mode; /* 文件的类型和存取权限 */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* 文件字节数 */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
3、判断文件各类操作
st_mode是用特征位来表示文件类型的,特征位的定义如下:
S_IFMT | 0170000 | 文件类型的位遮罩 |
---|---|---|
S_IFSOCK | 0140000 | socket |
S_IFLNK | 0120000 | 符号链接(symbolic link) |
S_IFREG | 0100000 | 一般文件 |
S_IFBLK | 0060000 | 区块装置(block device) |
S_IFDIR | 0040000 | 目录 |
S_IFCHR | 0020000 | 字符装置(character device) |
S_IFIFO | 0010000 | 先进先出(fifo) |
S_ISUID | 0004000 | 文件的(set user-id on execution)位 |
S_ISGID | 0002000 | 文件的(set group-id on execution)位 |
S_ISVTX | 0001000 | 文件的sticky位 |
S_IRWXU | 00700 | 文件所有者的遮罩值(即所有权限值) |
S_IRUSR | 00400 | 文件所有者具可读取权限 |
S_IWUSR | 00200 | 文件所有者具可写入权限 |
S_IXUSR | 00100 | 文件所有者具可执行权限 |
S_IRWXG | 00070 | 用户组的遮罩值(即所有权限值) |
S_IRGRP | 00040 | 用户组具可读取权限 |
S_IWGRP | 00020 | 用户组具可写入权限 |
S_IXGRP | 00010 | 用户组具可执行权限 |
S_IRWXO | 00007 | 其他用户的遮罩值(即所有权限值) |
S_IROTH | 00004 | 其他用户具可读取权限 |
S_IWOTH | 00002 | 其他用户具可写入权限 |
S_IXOTH | 00001 | 其他用户具可执行权限 |
判断文件类型时,用对文件的st_mode的值与上面给出的值相与,再比较。
还有一种简单的方法,利用系统提供好的宏直接比较:
宏 | 功能 |
---|---|
S_ISLINGK(st_mode) | 判断是否位符号链接 |
S_ISREG(st_mode) | 是否为一般文件 |
S_ISDIR(st_mode) | 是否为目录 |
S_ISCHR(st_mode) | 是否位字符装置文件 |
S_ISBLK(s3e) | 是否先进先出 |
S_ISSOCK(st_mode) | 是否为socket |