系统编程之文件IO(六)——获取文件属性(stat、fstat、lstat、struct stat)

一、struct stat

系统已经定义好了
位于:<sys/stat.h>
在这里插入图片描述

struct stat { 
    dev_t         st_dev;       //文件的设备编号 
    ino_t         st_ino;       //节点 
    mode_t        st_mode;      //文件的类型和存取的权限 
    nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1 
    uid_t         st_uid;       //用户ID 
    gid_t         st_gid;       //组ID 
    dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号 
    off_t         st_size;      //文件字节数(文件大小) 
    unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小) 
    unsigned long st_blocks;    //块数 
    time_t        st_atime;     //最后一次访问时间 
    time_t        st_mtime;     //最后一次修改时间 
    time_t        st_ctime;     //最后一次改变时间(指属性) 
};

二、stat、fstat、lstat

int stat(const char *path, struct stat *buf) //没打开
int fstat(int filedes, struct stat *buf)//打开了
int lstat(const char path, struct stat *buf)

path :文件路径
filedes :文件描述符

三、获取文件长度

  1. int file_size = lseek(fd, 0, SEEK_END)
//get file_size
    struct stat file1;
    //stat(argv[1], &file1);
    //fstat(fd,&file1);
    lstat(argv[1], &file1);

    printf("file_size = %ld\n", file1.st_size);

四、fstat、stat和lstat的区别:

int fstat(int filedes, struct stat *buf);
int stat(const char *path, struct stat *buf);
int lstat(const char *path, struct stat *buf);

聪明人一眼就能看出来fstat的第一个参数是和另外两个不一样的,对!fstat区别于另外两个系统调用的地方在于,fstat系统调用接受的是 一个“文件描述符”,而另外两个则直接接受“文件全路径”。文件描述符是需要我们用open系统调用后才能得到的,而文件全路经直接写就可以了。
stat和lstat的区别:当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;而stat返回的是该链接指向的文件的信息。(似乎有些晕吧,这样记,lstat比stat多了一个l,因此它是有本事处理符号链接文件的,因此当遇到符号链接文件时,lstat当然不会放过。而 stat系统调用没有这个本事,它只能对符号链接文件睁一只眼闭一只眼,直接去处理链接所指文件喽)

参考文章:Linux中fstat、stat和lstat的用法与区别

posted @ 2022-04-15 15:16  周末不下雨  阅读(48)  评论(0编辑  收藏  举报