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

PTN*_*PTN 0 c io

如何检查文件是否不存在或存在但我没有阅读权限?

我知道我可以使用类似的东西perror()strerror(errno)打印消息,但如果我想要一个我可以这样处理的检查,我该怎么做:

if (not exist) {
    create file;
}
else if (no permission) {
    exit;
}
Run Code Online (Sandbox Code Playgroud)

这是我正在处理的代码.我认为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
Run Code Online (Sandbox Code Playgroud)

lar*_*sks 5

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).
Run Code Online (Sandbox Code Playgroud)

这告诉您,如果您想找出系统调用失败的原因,您需要检查该errno变量,该变量可能设置为EACCESS(权限被拒绝)或ENOENT(没有此类文件或目录)等。

看起来是一个合理的例子。


小智 5

不要试图提前知道您是否可以写入或读取文件 - 当您的支票与实际访问之间的信息发生变化时,您将遇到竞争条件.做类似以下的事情

int fd = open(path, O_RDWR|O_CREAT, 00666);
if (fd < 0) exit(1);
Run Code Online (Sandbox Code Playgroud)

如果您必须知道无法打开或创建文件的原因,您当然需要更多代码来检查errno.

编辑以澄清:O_CREAT只会在尚未存在的情况下尝试创建该文件.但是这个检查是在操作系统内完成的,所以它是你的进程的原子操作(没有其他进程可以改变尝试打开文件和尝试创建它之间的情况).