1.stat命令,可以获取文件的详细信息 命令行输入:stat filename
2.stat函数 头文件: #include<sys/types.h> #include<sys/stat.h> #include<unistd.h>
接口:extern int stat (const char *__restrict __file, struct stat *__restrict __buf)
参数: 1.第一个参数是要获取信息的文件的名字 2.第二个参数是stat类型的结构体指针,用于存储获取的信息 返回值: 成功则返回0,失败则返回-1,并且将errno设置为对应的错误信息
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 filesystem I/O */ blkcnt_t st_blocks; /* number of 512B blocks allocated */ 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 */ #define st_atime st_atim.tv_sec /* Backward compatibility */ #define st_mtime st_mtim.tv_sec #define st_ctime st_ctim.tv_sec }; struct timespec { __kernel_time_t tv_sec; /* seconds:当前时间到1970.1.1 0:0:0的秒数 */ long tv_nsec; /* nanoseconds: 纳秒*/ };测试代码
//实现ls -l stat.txt #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <time.h> #include <pwd.h> #include <grp.h> int main(int argc, char* argv[]) { if(argc!=2){ printf("argv is less,input filename\n"); return -1; } struct stat buf; //stat(argv[1],&buf); //获取文件信息,并保存到buf lstat(argv[1], &buf); //文件类型与权限 char stmode[11]={0}; memset(stmode,'-',10); if(S_ISREG(buf.st_mode)) stmode[0]='-'; //普通文件 else if(S_ISDIR(buf.st_mode)) stmode[0]='d'; //目录文件 else if(S_ISCHR(buf.st_mode)) stmode[0]='c'; //字符设备 else if(S_ISBLK(buf.st_mode)) stmode[0]='b'; //块设备 else if(S_ISFIFO(buf.st_mode)) stmode[0]='p'; //管道 else if(S_ISLNK(buf.st_mode)) stmode[0]='l'; //链接符号 else if(S_ISSOCK(buf.st_mode)) stmode[0]='s'; //socket文件 //解析权限 if(buf.st_mode & S_IRUSR) stmode[1] = 'r'; if(buf.st_mode & S_IWUSR) stmode[2] = 'w'; if(buf.st_mode & S_IXUSR) stmode[3] = 'x'; if(buf.st_mode & S_IRGRP) stmode[4] = 'r'; if(buf.st_mode & S_IWGRP) stmode[5] = 'w'; if(buf.st_mode & S_IXGRP) stmode[6] = 'x'; if(buf.st_mode & S_IROTH) stmode[7] = 'r'; if(buf.st_mode & S_IWOTH) stmode[8] = 'w'; if(buf.st_mode & S_IXOTH) stmode[9] = 'x'; //获取时间 struct tm *filetime = localtime(&buf.st_atim.tv_sec); char timebuf[20] = {0}; sprintf(timebuf, "%d月 %d d:d", filetime->tm_mon+1, filetime->tm_mday, filetime->tm_hour,filetime->tm_min); printf("%s %ld %s %s %ld %s %s\n", stmode, buf.st_nlink, getpwuid(buf.st_uid)->pw_name, getgrgid(buf.st_gid)->gr_name, buf.st_size, timebuf, argv[1]); //getpwuid() 获取用户名, getgrgid() 获取组名 return 0; }结果