Linux里stat命令与stat和lstat函数

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;
}

结果
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值