如何检查文件是否存在或文件是否存在但我无权阅读?
我知道我可以使用perror()
或strerror(errno)
之类的内容来打印消息,但如果我想要检查一下我可以这样处理,我该怎么做:
if (not exist) {
create file;
}
else if (no permission) {
exit;
}
这是我正在处理的代码。我认为err
总是= -1,当文件不存在或我没有权限时,所以我不知道如何处理它。
int fdPath, n, err;
unsigned char buffer[4096];
char *path;
// get path
path = argv[1];
// get file descriptor from opening file
fdPath = open(path, O_RDWR);
err = read(fdPath, buffer, 4096); // read file in path
答案 0 :(得分:5)
不要试图提前知道 是否可以写入或读取文件 - 当您的支票与实际访问权限之间的信息发生变化时,您将遇到竞争条件。做类似以下的事情
int fd = open(path, O_RDWR|O_CREAT, 00666);
if (fd < 0) exit(1);
如果您必须知道无法打开或创建文件的原因,您当然需要更多代码来检查errno
。
编辑澄清:O_CREAT
只会尝试创建尚未存在的文件。但是这个检查是在操作系统内完成的,所以它是你的进程的原子操作(没有其他进程可以改变尝试打开文件和尝试创建它之间的情况。)
答案 1 :(得分:4)
来自open(2)
手册页:
RETURN VALUE
open(), openat(), and creat() return the new file descriptor,
or -1 if an error occurred (in
which case, errno is set appropriately).
这告诉您如果要查找系统调用失败的原因,则需要检查errno
变量,该变量可能设置为EACCESS
(允许拒绝)或ENOENT
(没有这样的文件或目录)等。
This看起来是一个合理的例子。
答案 2 :(得分:2)
在POSIX系统上,您可以使用access检查文件是否存在和/或是否可读。但是,请注意,如果您首先检查文件的存在,并且稍后,如果它不存在,则创建它,可能存在争用(在检查存在和创建之间)。