如何检查文件是否在C中具有读取权限?
答案 0 :(得分:9)
在POSIX中使用access(2)
。在标准C中,您可以尝试使用fopen()
打开它,看看它是否成功。
如果fopen()
返回NULL
,您可以尝试使用errno
来区分“文件不存在”(errno == ENOENT
)和“权限被拒绝”({ {1}})个案例 - 但不幸的是,这两个errno == EACCES
值也仅由POSIX定义。
(即使在POSIX上,在大多数情况下,最好的办法是尝试打开文件,然后查看失败的原因,因为使用errno
会引入明显的竞争条件。)
答案 1 :(得分:8)
我很喜欢自己使用stat()。
答案 2 :(得分:7)
使用access()功能:
if (access(pathname, R_OK) == 0)
{
/* It's readable by the current user. */
}
如果文件不存在, errno
将设置为ENOENT
;如果存在,则EACCES
将设置为{{1}}但当前用户无法访问。有关更多错误代码,请参阅the manual page。
答案 3 :(得分:1)
有许多方法可以检查文件权限。
一种非常简单的查找权限的方法是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年前。我只是想对常见的文件处理方法做一个概述。