检查文件是否不存在或权限被拒绝C.

时间:2015-07-26 18:32:40

标签: c io

如何检查文件是否存在或文件是否存在但我无权阅读?

我知道我可以使用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

3 个答案:

答案 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检查文件是否存在和/或是否可读。但是,请注意,如果您首先检查文件的存在,并且稍后,如果它不存在,则创建它,可能存在争用(在检查存在和创建之间)。