Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查文件是否不存在或权限被拒绝C_C_Io - Fatal编程技术网

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

检查文件是否不存在或权限被拒绝C,c,io,C,Io,如何检查文件是否不存在,或者它是否存在,但我没有读取它的权限 我知道我可以使用perror或Strerrorno之类的东西来打印邮件,但如果我想要一张支票,我可以这样处理,我该怎么做: if (not exist) { create file; } else if (no permission) { exit; } 这是我正在编写的代码。我认为当文件不存在或我没有权限时,err总是=-1,所以我不知道如何处理它 int fdPath, n, err; unsigned c

如何检查文件是否不存在,或者它是否存在,但我没有读取它的权限

我知道我可以使用perror或Strerrorno之类的东西来打印邮件,但如果我想要一张支票,我可以这样处理,我该怎么做:

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
从open2手册页:

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 permissioned denied或enoint no这样的文件或目录等

这似乎是一个合理的例子。

不要试图事先知道您是否可以写入或读取文件-当您的支票和实际访问之间的信息发生变化时,您将面临竞争条件。执行以下操作

int fd = open(path, O_RDWR|O_CREAT, 00666);
if (fd < 0) exit(1);
如果您必须知道无法打开或创建文件的原因,那么您当然需要更多检查errno的代码


编辑以澄清:O_CREAT只会在文件不存在时尝试创建该文件。但是此检查是在操作系统内部完成的,因此它是进程的原子操作,其他进程无法改变尝试打开文件和尝试创建文件之间的情况。

在POSIX系统上,您可以使用检查文件是否存在和/或是否可读。但是,请注意,如果先检查文件是否存在,然后再检查不存在的文件是否创建,则检查存在与创建之间可能存在竞争。

尝试打开文件并检查错误号。如果出现故障,它将不可移植地告诉您原因。请注意,根据您的具体需要,添加O_EXCL标志以打开也可能很有用-如果包含该标志,则仅当该文件不存在时才会创建该文件。@JohnHascall否,这是错误的。如果文件存在,带有O_CREAT的O_EXCL将失败。O_CREAT独自打开它,而不创建it@JohnHascall仅当文件不存在时,才会创建该文件。好的,我想我们只是在说同样的事情O_CREAT,file exists=>existing file opened;O_create,文件不存在=>创建并打开的新文件;O_create | O_EXCL,文件存在=>失败,未打开任何内容;O|u CREAT | O|u EXCL,文件不存在=>已创建并打开的新文件