【发布时间】:2020-11-22 11:08:08
【问题描述】:
如何在 C 中检查文件是否具有读取权限?
【问题讨论】:
标签: c permissions
如何在 C 中检查文件是否具有读取权限?
【问题讨论】:
标签: c permissions
在 POSIX 中使用 access(2)。在标准 C 中,你能做的最好的就是尝试用fopen() 打开它,看看它是否成功。
如果fopen()返回NULL,你可以尝试使用errno来区分“文件不存在”(errno == ENOENT)和“权限被拒绝”(errno == EACCES)的情况——但不幸的是那些两个 errno 值也仅由 POSIX 定义。
(即使在 POSIX 上,大多数情况下最好的办法是尝试打开文件,然后查看失败的原因,因为使用 access() 会引入明显的竞争条件)。
【讨论】:
我自己喜欢使用stat()。
【讨论】:
使用access()函数:
if (access(pathname, R_OK) == 0)
{
/* It's readable by the current user. */
}
如果文件不存在,errno 将设置为 ENOENT,如果文件存在但当前用户无法访问,则设置为 EACCES。更多错误代码见the manual page。
【讨论】:
有很多方法可以检查文件的权限。
找出权限的一个非常简单的方法是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 年前的。我只是想对常见的文件处理方法做一个大致的概述。
【讨论】: