C检查文件是否存在

时间:2011-04-21 14:10:48

标签: c c89

在我必须在C89标准中执行的项目中,我必须检查文件是否存在。 我该怎么做?

我想过使用

FILE *file;
if ((file = fopen(fname, "r")) == NULL)
{
  printf("file doesn't exists");
}
return 0;

但我认为可能会有更多的情况,那么文件不存在会做fopen == NULL。

我该怎么做?我宁愿不使用包含而不是。

5 个答案:

答案 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,我认为这是相当广泛的标准。