• Linux 文件操作(三) —— 获取并打印某个文件的属性(文件类型、执行权限、文件大小)


            目录

    1、获取文件属性 stat / lstat / fstat

    (1) 参数 path

    (2) 参数 buf

    (3) 返回值

    2、获取并打印某个文件的属性

    (1) 获取文件类型

    (2) 获取文件权限

    (3) 获取文件大小

    (4) 获取上一次的访问时间

    (5) 最终代码


    1、获取文件属性 stat / lstat / fstat

    stat / lstat / fstat 函数的作用是获取文件属性,stat 函数可以通过文件路径获取到任意文件(链接文件除外)的属性,lstat 获取的是链接文件的属性,fstat 是通过文件描述符获取到文件属性。

     下面以 stat 函数为例介绍参数和返回值

    (1) 参数 path

    输入型参数,代表文件所在路径。如果path对应的文件是一个符号链接,那么stat 获取到的是目标文件的属性,而不是链接文件的属性;如果要获取链接文件的属性,需使用 lstat。

    (2) 参数 buf

    输出型参数,获取到的文件属性会放入这个结构体中。结构体的大致定义如下:

    (3) 返回值

    成功返回 0,失败返回 -1

    2、获取并打印某个文件的属性

    假设我们有一个 log.txt文件,我们要获取这个文件的类型、访问权限、文件大小、上一次访问时间,最终完整代码访问最后,中间是一些零碎的代码。

    (1) 获取文件类型

    Linux提供了一些宏函数来判断是哪种文件类型

    • S_ISREG(st_mode)  :是否为常规文件?
    • S_ISDIR(st_mode)  :是否为目录?
    • S_ISCHR(st_mode)  :是否为字符设备?
    • S_ISBLK(st_mode)  :是否为块设备?
    • S_ISFIFO(st_mode) :是否为FIFO文件?
    • S_ISLNK(st_mode)  :是否为链接文件?
    • S_ISSOCK(st_mode) :是否为Socket文件?
    1. # st 代表获取到的文件属性结构体
    2. if(S_ISREG(st.st_mode))
    3. printf("-");
    4. else if(S_ISREG(st.st_mode))
    5. printf("d");
    6. else if(S_ISCHR(st.st_mode))
    7. printf("c");
    8. else if(S_ISBLK(st.st_mode))
    9. printf("b");
    10. else if(S_ISFIFO(st.st_mode))
    11. printf("p");
    12. else if(S_ISLNK(st.st_mode))
    13. printf("l");
    14. else
    15. printf("s"); // 其他归为套接字文件类型

    (2) 获取文件权限

    其实Linux也提供了一些宏来判断该文件是否具备指定权限,但是我们要遍历该文件的所有权限,st_mode成员存储权限的方式是位图存储,每个权限对应 1bit ,我们可以通过移位来获取这九个权限。

    1. int i = 8;
    2. for(; i >= 0; i--)
    3. {
    4. if((st.st_mode >> i) & 1) // 先判断有无权限
    5. {
    6. // 判断具体是哪一种权限
    7. if(i % 3 == 0)
    8. {
    9. printf("r"); // 读权限
    10. }
    11. else if(i % 3 == 1)
    12. {
    13. printf("w"); // 写权限
    14. }
    15. else
    16. {
    17. printf("x); // 执行权限
    18. }
    19. }
    20. else
    21. {
    22. printf("-"); // 无权限
    23. }
    24. }

    (3) 获取文件大小

    printf(" %d", (int)st.st_size);

    (4) 获取上一次的访问时间

    获取时间需要使用 localtime 函数转换成我们可以识别的格式,localtime函数的声明如下:

     我们重点看返回的结构体定义,这里包含了我们需要的时间信息

    1. struct tm t;
    2. t = localtime(st.st_atime);
    3. // 月是从0开始计的,所以要加 1
    4. printf(" %d-%d-%d %d:%d",t.tm_year, t.tm_month+1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec);

    (5) 最终代码

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main(){
    7. struct stat st;
    8. int ret = stat("./log.txt",&st);
    9. if(ret < 0)
    10. {
    11. perror("stat");
    12. return -1;
    13. }
    14. if(S_ISREG(st.st_mode))
    15. printf("-");
    16. else if(S_ISREG(st.st_mode))
    17. printf("d");
    18. else if(S_ISCHR(st.st_mode))
    19. printf("c");
    20. else if(S_ISBLK(st.st_mode))
    21. printf("b");
    22. else if(S_ISFIFO(st.st_mode))
    23. printf("p");
    24. else if(S_ISLNK(st.st_mode))
    25. printf("l");
    26. else
    27. printf("s");
    28. int i = 8;
    29. for(;i >= 0; i--)
    30. {
    31. if((st.st_mode >> i) & 1)
    32. {
    33. if(i%3 == 2)
    34. printf("r");
    35. else if(i%3 == 1)
    36. printf("w");
    37. else
    38. printf("x");
    39. }
    40. else
    41. printf("-");
    42. }
    43. printf(" %d", (int)st.st_size);
    44. struct tm* t;
    45. t = localtime(&(st.st_atime));
    46. // 月是从0开始计的,所以要加 1
    47. printf(" %d-%d-%d %d:%d\n",t->tm_year+1900, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min);
    48. return 0;
    49. }

  • 相关阅读:
    Mac如何打开企业微信内置浏览器控制台
    关于a标签不同状态下变化颜色样式的写法注意事项
    mysql中的str_to_date 函数
    LLM面面观之MoE
    HTTP 协议的基本格式和 fiddler 的简单使用
    halcon脚本-机器学习【OCR】【附源码】
    webpack中的代理配置
    串口通信原理及应用
    HCIP学习笔记-存储服务规划 -4
    crypto 加解密库简介与测试【GO 常用的库】
  • 原文地址:https://blog.csdn.net/challenglistic/article/details/128016236