当前位置:   article > 正文

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 <sys/types.h>
  2. #include <time.h>
  3. #include <stdio.h>
  4. #include <sys/stat.h>
  5. #include <unistd.h>
  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. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/556443
推荐阅读
相关标签
  

闽ICP备14008679号