这里介绍三个关于文件属性的核心函数: stat()
函数、 fstat()
函数和 lstat()
函数以及其所返回的信息。
语法如下:
#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int stat(const char *path, struct stat *buf); int fstat(int fd, struct stat *buf); int lstat(const char *path, struct stat *buf);点击复制复制失败已复制
stat()
函数得到一个与 path
所指定的文件有关的信息结构,并保存在第二个参数 buf
中。 fstat()
函数需要将文件打开之后的文件描述符作为参数,其功能与 stat()
函数一致。 lstat()
函数类似于 stat()
函数,只不过其参数 path
指向的文件是一个符号链接。 lstat()
函数返回符号链接的有关信息,而不是由该符号链接引用的文件的信息。
第二个参数 buf
是一个结构体指针,它指向一个已定义的结构体,该结构体的实际定义可能会随实现的不同而有所不同。其基本形式如下所示:
struct stat { __dev_t st_dev; /* Device. */ __ino_t st_ino; /* File serial number. */ __ino_t __st_ino; /* 32bit file serial number. */ __mode_t st_mode; /* File mode. */ __nlink_t st_nlink; /* Link count. */ __nlink_t st_nlink; /* Link count. */ __mode_t st_mode; /* File mode. */ __uid_t st_uid; /* User ID of the file's owner. */ __gid_t st_gid; /* Group ID of the file's group.*/ int __pad0; __dev_t st_rdev; /* Device number, if device. */ unsigned short int __pad2; __off_t st_size; /* Size of file, in bytes. */ __off64_t st_size; /* Size of file, in bytes. */ __blksize_t st_blksize; /* Optimal block size for I/O. */ __blkcnt_t st_blocks; /* Number 512-byte blocks allocated. */ __blkcnt64_t st_blocks; /* Number 512-byte blocks allocated. */ /* Nanosecond resolution timestamps are stored in a format equivalent to 'struct timespec'. This is the type used whenever possible but the Unix namespace rules do not allow the identifier 'timespec' to appear in the <sys/stat.h> header. Therefore we have to handle the use of this header in strictly standard-compliant sources special. */ struct timespec st_atim; /* Time of last access. */ struct timespec st_mtim; /* Time of last modification. */ struct timespec st_ctim; /* Time of last status change. */ __time_t st_atime; /* Time of last access. */ __syscall_ulong_t st_atimensec; /* Nscecs of last access. */ __time_t st_mtime; /* Time of last modification. */ __syscall_ulong_t st_mtimensec; /* Nsecs of last modification. */ __time_t st_ctime; /* Time of last status change. */ __syscall_ulong_t st_ctimensec; /* Nsecs of last status change. */ __syscall_slong_t __glibc_reserved[3]; unsigned long int __glibc_reserved4; unsigned long int __glibc_reserved5; __ino64_t st_ino; /* File serial number. */ };点击复制复制失败已复制
提示
上述文件内容来自于 Ubuntu 20.04
操作系统的 /usr/include/x86_64-linux-gnu/bits/stat.h
文件,经过一些定义删减。
这样通过读取第二个参数的结构体成员,就可以获取文件的属性,我们先建立一个 test.txt
测试文件,里面写入 hello world
测试内容,然后新建 main.c
文件,写入如下内容:
#include <stdio.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> int main(int argc, const char *argv[]) { struct stat buf; if (stat("test.txt", &buf) == 0) { printf("%d %d %d \n", buf.st_uid, buf.st_gid, buf.st_size); } return; }点击复制复制失败已复制
接下来编译并执行:
$ gcc main.c $ ./a.out 1000 1000 11点击复制复制失败已复制
程序得到文件的 所属用户的ID
为 1000
,其 用户所在组ID
为 1000
,文件的大小为 11
字节。如果需要得到文件的更多信息,选择更多的信息输出即可。