检查文件是否不存在或权限被拒绝C
如何检查文件是否不存在,或者它是否存在,但我没有读取它的权限 我知道我可以使用perror或Strerrorno之类的东西来打印邮件,但如果我想要一张支票,我可以这样处理,我该怎么做:检查文件是否不存在或权限被拒绝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
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,文件不存在=>已创建并打开的新文件