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 %02d:%02d", 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;
}
结果