当前位置:   article > 正文

stat、lstat以及文件权限、文件类型_stat 和 lstat

stat 和 lstat

一、stat获取文件信息

  stat 函数是一个在UNIX和类UNIX操作系统中广泛使用的系统调用,用于获取指定文件的详细信息,包括文件的权限、大小、类型、所有者、修改时间等等。它通常用于编写程序,以便检查和操作文件的属性和元数据。

  1. /*
  2. * #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <unistd.h>
  5. int stat(const char *pathname, struct stat *statbuf);
  6. 作用: 查看一个文件的信息
  7. 参数:
  8. -pathname:操作的文件路径
  9. -statbuf:结构体变量,传出参数
  10. 返回值:
  11. 成功:返回0
  12. 失败:返回-1,errno
  13. int lstat(const char *pathname, struct stat *statbuf);
  14. 作用:
  15. 参数:
  16. -pathname:操作的文件路径
  17. -statbuf:结构体变量,传出参数
  18. 返回值:
  19. 成功:返回0
  20. 失败:返回-1,errno
  21. struct stat {
  22. dev_t st_dev; // 文件所在设备的设备号
  23. ino_t st_ino; // 文件的i-node号
  24. mode_t st_mode; // 文件权限和文件类型
  25. nlink_t st_nlink; // 链接数
  26. uid_t st_uid; // 文件所有者的用户ID
  27. gid_t st_gid; // 文件所属组的组ID
  28. off_t st_size; // 文件大小(字节数)
  29. blksize_t st_blksize; // 文件系统I/O操作的块大小
  30. blkcnt_t st_blocks; // 文件占用的块数
  31. time_t st_atime; // 最后访问时间
  32. time_t st_mtime; // 最后修改时间
  33. time_t st_ctime; // 最后状态改变时间
  34. };
  35. */
  36. #include <sys/types.h>
  37. #include <sys/stat.h>
  38. #include <unistd.h>
  39. #include <stdio.h>
  40. int main(){
  41. struct stat statbuf;
  42. int ret = stat("F:\\C++\\C++\\c++linux\\linux_io_fun\\examples.txt",&statbuf);
  43. if(ret==-1){
  44. perror("stat");
  45. return -1;
  46. }
  47. printf("size:%ld\n",statbuf.st_size);
  48. return 0;
  49. }

二、lstat

创建软连接:

ln -s a.txt b.txt

  lstat 函数是在UNIX和类UNIX操作系统中使用的系统调用,它与 stat 函数类似,用于获取文件的详细信息,包括文件的权限、大小、类型、所有者、修改时间等等。但是,lstatstat 之间存在一个重要的区别,即 lstat 专门用于获取符号链接(symlink)文件的信息,而不是跟踪符号链接所指向的目标文件。

  1. #include <sys/stat.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. int main() {
  6. const char *filename = "symlink_example"; // 符号链接文件的路径
  7. struct stat file_info;
  8. // 使用lstat函数获取符号链接文件的信息
  9. if (lstat(filename, &file_info) == 0) {
  10. printf("文件名:%s\n", filename);
  11. printf("文件大小:%lld 字节\n", (long long)file_info.st_size);
  12. printf("权限:%o\n", file_info.st_mode & 0777); // 文件权限
  13. printf("所有者的用户ID:%d\n", file_info.st_uid);
  14. printf("所有者的组ID:%d\n", file_info.st_gid);
  15. printf("修改时间:%s", ctime(&file_info.st_mtime)); // 修改时间
  16. // 其他信息如访问时间等也可以从file_info结构中获取
  17. } else {
  18. perror("lstat"); // 输出错误信息
  19. return errno; // 返回错误代码
  20. }
  21. return 0;
  22. }

三、文件权限

        文件权限是指在UNIX和类UNIX操作系统中,用于控制文件和目录访问的权限。这些权限通常表示为三组权限位:用户权限、组权限和其他权限。每个权限位可以设置为读取(r)、写入(w)和执行(x)的组合。在文件权限中,按位与(bitwise AND)通常用于检查某个用户是否具有特定权限。

以下是文件权限的一些常见值和它们的含义:

  • 读取权限(r):允许用户读取文件的内容或查看目录的内容。
  • 写入权限(w):允许用户修改文件的内容或在目录中创建、删除和重命名文件。
  • 执行权限(x):对于文件,允许用户执行可执行文件;对于目录,允许用户访问目录中的文件列表。

每个文件或目录都有三个权限集:

  1. 用户权限:通常是文件的所有者。
  2. 组权限:通常是与文件或目录关联的用户组的成员。
  3. 其他权限:不是文件所有者也不是组成员的其他用户。

为了检查用户是否具有某个权限,可以使用按位与运算来比较用户的权限位和所需的权限位。这里是一些示例:

  1. if (权限位 & 4) {
  2. // 用户具有读取权限
  3. }
  1. if (权限位 & 2) {
  2. // 用户具有写入权限
  3. }
  1. if (权限位 & 1) {
  2. // 用户具有执行权限
  3. }

        权限位是一个包含用户、组和其他权限的三位二进制数字。按位与运算用来检查相应的权限位是否设置为1,如果设置为1,则表示用户具有该权限。

四、文件类型

        我们使用 S_IFMT (八进制)进行与运算,提取了文件类型信息,然后根据不同的文件类型值进行了判断。这允许你确定文件的基本类型,如普通文件、目录、符号链接等。请注意,stat 函数用于获取文件信息。

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

闽ICP备14008679号