在我必须在C89标准中执行的项目中,我必须检查文件是否存在。 我该怎么做?
我想过使用
FILE *file;
if ((file = fopen(fname, "r")) == NULL)
{
printf("file doesn't exists");
}
return 0;
但我认为可能会有更多的情况,那么文件不存在会做fopen == NULL。
我该怎么做?我宁愿不使用包含而不是。
答案 0 :(得分:14)
如果您不能在您的环境中使用stat()(这绝对是更好的方法),只需评估errno。不要忘记包含errno.h。
FILE *file;
if ((file = fopen(fname, "r")) == NULL) {
if (errno == ENOENT) {
printf("File doesn't exist");
} else {
// Check for other errors too, like EACCES and EISDIR
printf("Some other error occured");
}
} else {
fclose(file);
}
return 0;
编辑:忘了将fclose包装成其他
答案 1 :(得分:3)
在纯ISO标准C中检查某些是不可能的。 没有非常好的可移植方式来确定是否有命名文件 存在;你可能不得不求助于系统特定的方法。
答案 2 :(得分:2)
这不是一个便携式的东西,所以我会给你特定于操作系统的电话。
在Windows中,您使用GetFileAttributes
并检查-1返回(INVALID_HANDLE
或类似的东西)。
在Linux中,您有fstat
来执行此操作。
然而,大多数时候,我只是做文件打开技巧来测试,或者只是继续使用该文件并检查异常(C ++ / C#)。
答案 3 :(得分:1)
我想这与系统环境(例如POSIX或BSD)有关,而不是与您使用的C语言版本有关。
在POSIX中有一个stat()系统调用,它会为您提供有关文件的信息,即使您无法读取它。但是,如果文件位于您没有访问权限的路径中,则无论文件是否存在,该文件始终都会失败。
如果您无法访问该路径,则永远不可能查看包含的文件。
答案 4 :(得分:1)
您真的想要访问该文件吗?检查通常更好 从unistd.h访问(filename,F_OK)== 0,我认为这是相当广泛的标准。