stat函数
函数常用的定义:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf);
第一个参数是文件名,第二个参数是stat的结构体,用来存放stat取出来的元数据
stat结构体内容如下:
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
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; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system 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 */
};
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/stat.h>
#include<string.h>
#include<pwd.h>
#include<time.h>
#include<grp.h>
void file_type(mode_t mode) {
char buf[11] = "?---------";
switch (mode & S_IFMT) {
case S_IFSOCK: buf[0] = 's'; break;
case S_IFLNK:buf[0] = 'l'; break;
case S_IFREG:buf[0] = '-'; break;
case S_IFBLK:buf[0] = 'b'; break;
case S_IFDIR:buf[0] = 'd'; break;
case S_IFCHR:buf[0] = 'c'; break;
case S_IFIFO:buf[0] = 'p'; break;
}
if (mode & S_IRUSR) buf[1] = 'r';
if (mode & S_IWUSR) buf[2] = 'w';
if (mode & S_IXUSR) buf[3] = 'x';
if (mode & S_IRGRP) buf[4] = 'r';
if (mode & S_IWGRP) buf[5] = 'w';
if (mode & S_IXGRP) buf[6] = 'x';
if (mode & S_IROTH) buf[7] = 'r';
if (mode & S_IWOTH) buf[8] = 'w';
if (mode & S_IXOTH) buf[9] = 'x';
printf("%s. ", buf);
}
int main(int argc, char* argv[]) {
if (argc == 1)
printf("usage : %s file\n", argv[0]), exit(0);
struct stat buf;
if (stat(argv[1], &buf) == -1)
perror("stat"), exit(1);
file_type(buf.st_mode);
printf("%d ", buf.st_nlink);
//getpwuid函数根据uid号获取文件拥有者的名字
struct passwd* pw = getpwuid(buf.st_uid);
printf("%s ", pw->pw_name);
//getgrgid函数根据gid号获得属组的名字
struct group* gp = getgrgid(buf.st_gid);
printf("%s ", gp->gr_name);
printf("%d ", buf.st_size);
struct tm* ptm = localtime(&buf.st_mtime);
printf("%04d-%02d-%02d %02d:%02d ", ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday,
ptm->tm_hour, ptm->tm_min);
printf("%s\n ", argv[1]);
return 0;
}