说明:转载请注明出处
函数的具体信息如下表:
用于获取文件信息的函数
|
头文件 |
<sys/types.h> <sys/stat.h> <unistd.h> | ||
|
函数形式 |
int stat(const char *path, struct stat *buf); int fstat(int filedes, struct stat *buf); int lstat(const char *path, struct stat *buf); | ||
|
返回值 |
成功 |
失败 |
是否设置errno |
|
0 |
-1 |
是 | |
说明:
即使没有对该文件的读取权限,仍然可以获得文件信息。对于stat函数和lstat函数,如果是要获得处于某个目录下的文件信息,则要求对该文件所处的所有上级目录有相应的进入权限,即对目录要具有可执行权限(x)。
(1):stat函数通过指向所处路径的指针获取相关文件信息,并将该文件信息写入函数的第二个参数,该参数是指向stat结构体的指针。
(2):lstat函数与stat函数功能是几乎完全相同的。如果给出的文件或目录所处的路径是一个符号链接(符号链接可以理解成类似于windows操作系统中的快捷方式的概念),获得的将是该符号链接的信息,而不是符号链接指向文件的相关信息。
(3):fstat函数与stat函数相同,只是调用的第一个参数换成了文件描述符。
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_dev :文件所处的磁盘设备ID号。
st_inode:inode索引号
st_mode:文件访问权限。Linux编程时遵循POSIX规范的,提供了如下的几个宏用于判断给出的路径所指向的类型,如下表:
POSIX中定义的检查文件类型的宏说明
|
宏定义形式 |
说明 |
|
S_ISREG(m) |
是否为普通文件 |
|
S_ISDIR(m) |
是否为目录 |
|
S_ISCHR(m) |
是否为字符设备 |
|
S_ISBLK(m) |
是否为块设备 |
|
S_ISFIFO(m) |
是否为FIFO(命名管道文件,用于进程通信) |
|
S_ISLNK(m) |
是否为符号链接 |
|
S_ISSOCK(m) |
是否为socket |
Linux系统还定义了如下表所示的宏,来表示st_mode文件访问权限:
st_mode中定义的相关宏
|
宏定义 |
值 |
说明 |
|
S_IFMT |
0170000 |
获得文件类型的屏蔽位 |
|
S_IFSOCK |
0140000 |
socket |
|
S_IFLNK |
0120000 |
符号链接 |
|
S_IFREG |
0100000 |
普通文件 |
|
S_IFBLK |
0060000 |
块设备 |
|
S_IFDIR |
0040000 |
目录 |
|
S_IFCHR |
0020000 |
字符设备 |
|
S_IFIFO |
0010000 |
FIFO文件 |
|
S_ISUID |
0004000 |
设置了用户ID位 |
|
S_ISGID |
0002000 |
设置了组ID位 |
|
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_nlink:该文件所具有的硬链接数
st_uid:文件所有者的用户ID号,该ID好是指哪个具体用户可以通过查看/etc/passwd文件获得。
st_gid:文件所有者所处的组ID。
st_rdev:如果所给出的路径指向的是某具体设备,该值将给出该设备的标识符信息。
st_size:对于常规文件,该值文件大小信息;对于符号链接,该值符号链接所指向的目录长度;对于设备文件,该值被赋值成0.
st_blksize:文件系统的块大小。
st_atime:文件的最后一次访问时间。
st_mtime:文件的最后一次修改时间。
st_ctime:对文件属性的最后一次修改时间。
错误信息:
EACCES:给出的文件所处路径没有访问权限。
EBADF:非法的文件描述符。
EFAULT:地址错误。
FLOOP:给出的文件所在路径中符号链接过多。
ENAMETOOLONG:文件名过长。
ENOENT:给出的文件所处路径不存在或路径为空字符串。
ENOMEM:内存不足。
ENOTDIR:给出的文件所处路径中含有不是目录的部分。
实例:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
//定义类型为stat的结构体file_stat,用于保存获得的文件信息
struct stat file_stat;
//判断程序是否带有一个参数执行,如果不是,给出提示并且结束运行
if ( argc != 2 )
{
printf("Usage:%s filename\n", argv[0]);
return (1);
}
//调用stat函数,如果出现错误,给出错误信息,程序退出
if (stat(argv[1], &file_stat) == -1)
{
perror("Cannot get the information of the file!\n");
return (1);
}
//使用POSIX中定义的宏判断是否是常规文件
if ( S_ISREG(file_stat.st_mode) )
{
printf("%s is Regular File,Judged by S_ISREG\n", argv[1]);
}
//通过st_mode与S_IFREG的位运算判断是否是常规文件
if ( file_stat.st_mode & S_IFREG )
{
printf("%s is Regular File,Judged by bits calculateS_IFREG\n", argv[1]);
}
//通过S_ISDIR宏判断是否是目录
if ( S_ISDIR(file_stat.st_mode) )
{
printf("%s is Directory, Judged by S_ISDIR\n", argv[1]);
}
if ( file_stat.st_mode & S_IFDIR )
{
printf("%s is Directory, Judged by bits calculate S_IFDIR\n",argv[1]);
}
//输出file_stat中的其他文件信息
printf("Owner ID: %d, Group ID: %d\n", file_stat.st_uid,file_stat.st_gid);
printf("Permission: %o\n", file_stat.st_mode & 0x1ff);
printf("Last Access Time: %15s\n",ctime(&file_stat.st_atime));
printf("Last Modification Time: %15s\n",ctime(&file_stat.st_mtime));
printf("Last Status Change Time: %15s\n", ctime(&file_stat.st_ctime));
return (0);
}
代码中给出了两种用于判断给出参数类型的方法:一种是使用POSIX标准中定义的宏表达式;一种是通过位运算得到。在获得访问访问权限时,程序将获得的st_mode值与一个十六进制的数进行位运算,0x1ff换算成八进制就是777.。要获得文件所有者的权限,需要和0700进行位运算。要获得文件所有者所在组的权限,需要和0070进行位运算。而要获得其他用户的权限,需要和0007进行位运算。要获得3者的权限,需要和777进行位运算,也就是程序中使用的0x1ff。
运行的结果:
[root@localhost test]# ./stat chdir
chdir is Regular File,Judged by S_ISREG
chdir is Regular File,Judged by bitscalculate S_IFREG
Owner ID: 0, Group ID: 0
Permission: 755
Last Access Time: Tue Apr 30 01:48:53 2013
Last Modification Time: Tue Apr 30 01:43:172013
Last Status Change Time: Tue Apr 3001:43:17 2013
本文介绍Linux下使用stat、fstat及lstat函数获取文件信息的方法,包括函数的使用方式、参数说明、返回值及错误处理等内容,并提供了一个具体的示例程序。
2580

被折叠的 条评论
为什么被折叠?



