在Linux中,可以利用stat()函数来获取一个文件的状态
-
#include
-
#include
-
-
int stat(const char *file_name, struct stat *buf);
这个函数执行成功返回0,失败返回-1。取得的文件状态存放在buf指针指向的struct stat结构提中, struct stat的定义如下:
-
struct stat
-
{
-
dev_t st_dev;
-
ino_t st_ino;
-
mode_t st_mode;
-
nlink_t st_nlink;
-
uid_t st_uid;
-
gid_t st_gid;
-
dev_t st_rdev;
-
off_t st_size;
-
blksize_t st_blksize;
-
blkcnt_t st_blocks;
-
time_t st_atime;
-
time_t st_mtime;
-
time_t st_ctime;
-
};
其中, st_mode这个变量用来判断文件类型。
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 其他用户具可执行权限
-
摘自《Linux C 函数库参考手册》
判断文件类型时,用对文件的st_mode的值与上面给出的值相与,再比较。比如:
-
#include
-
#include
-
#include
-
-
int main()
-
{
-
int abc;
-
struct stat buf;
-
stat("/home", &buf);
-
abc = buf.st_mode & S_IFDIR;
-
if(abc == S_IFDIR)
-
printf("It's a directory.\n");
-
return 0;
-
}
运行结果:
It's a directory.
其实还有一个简单的方法,文件类型在POSIX中定义了检查这些类型的宏定义:
-
S_ISLINGK(st_mode) 判断是否位符号链接
-
S_ISREG(st_mode) 是否为一般文件
-
S_ISDIR(st_mode) 是否为目录
-
S_ISCHR(st_mode) 是否位字符装置文件
-
S_ISBLK(s3e) 是否先进先出
-
S_ISSOCK(st_mode) 是否为socket
可以根据这些函数的返回值判断,如果是,则返回1。
阅读(6100) | 评论(0) | 转发(1) |