【问题标题】:c read a file's permissionsc 读取文件的权限
【发布时间】:2020-11-22 11:08:08
【问题描述】:

如何在 C 中检查文件是否具有读取权限?

【问题讨论】:

    标签: c permissions


    【解决方案1】:

    在 POSIX 中使用 access(2)。在标准 C 中,你能做的最好的就是尝试用fopen() 打开它,看看它是否成功。

    如果fopen()返回NULL,你可以尝试使用errno来区分“文件不存在”(errno == ENOENT)和“权限被拒绝”(errno == EACCES)的情况——但不幸的是那些两个 errno 值也仅由 POSIX 定义。

    (即使在 POSIX 上,大多数情况下最好的办法是尝试打开文件,然后查看失败的原因,因为使用 access() 会引入明显的竞争条件)。

    【讨论】:

    • 我会使用 fopen(),但我需要能够区分文件是否不可读以及是否不存在
    • 使用fopen会更好。因为访问容易受到 TOCTOU 攻击。 (en.wikipedia.org/wiki/TOCTOU)。如果这对您来说完全是一个问题。
    【解决方案2】:

    我自己喜欢使用stat()

    【讨论】:

    • 提问者询问如何读取文件的权限。 stat() 函数返回文件的权限。 fstat() 函数根据打开的文件句柄返回文件的权限。
    【解决方案3】:

    使用access()函数:

    if (access(pathname, R_OK) == 0)
    {
        /* It's readable by the current user. */
    }
    

    如果文件不存在,errno 将设置为 ENOENT,如果文件存在但当前用户无法访问,则设置为 EACCES。更多错误代码见the manual page

    【讨论】:

      【解决方案4】:

      有很多方法可以检查文件的权限。

      找出权限的一个非常简单的方法是int access(const char *path, int amode)。如前所述,除非出现错误,否则此方法将运行。您可以使用一些标志:

      F_OK:用于检查文件是否存在。

      R_OK:用于检查读取权限位。

      W_OK:用于检查写权限位。

      X_OK:用于检查执行权限位。

      当文件没有正确的权限时,会抛出一个错误,您可以使用 errno 进行检索。

      int fd = access("sample.txt", F_OK); 
      if(fd == -1){ 
              printf("Error Number : %d\n", errno); 
          perror("Error Description:"); 
      } 
      

      如果您想在检索文件地址时处理错误,请使用FILE *fopen(const char *filename, const char *mode)。与 access() 一样,它具有可以检查的标志,例如读取或写入。不同的是,fopen 可以使用字符串而不是常量,并且会返回一个 FILE 指针。

      FILE *pf = fopen ("fileName.txt", "rb");
      

      Here 是一个很好的例子,说明如何使用 fopen 处理错误

      第三种文件检查方法是int chmod(const char *path, mode_t mode)。 chmod() 比 access() 更有用,因为它有更多标志。根据您正在读取的目录,使用 access() 可能更容易,但如果您有许多不同权限的文件,那么 chmod() 会更有用。

      #include <sys/stat.h>
      int chmod(const char *path, mode_t mode);
      

      我知道这篇文章是 11 年前的。我只是想对常见的文件处理方法做一个大致的概述。

      【讨论】:

        猜你喜欢
        • 2018-09-21
        • 1970-01-01
        • 2011-12-21
        • 2011-05-27
        • 2016-02-02
        • 1970-01-01
        • 1970-01-01
        • 2017-02-12
        • 2019-12-25
        相关资源
        最近更新 更多