C,检查文件是否存在而不能读/写?

时间:2012-12-19 04:08:46

标签: c fopen

  

可能重复:
  What’s the best way to check if a file exists in C? (cross platform)

我想检查文件是否存在。我将测试文件的权限更改为“chmod -r somefile”。但是现在它说该文件即使存在也不存在。

所以我假设如果我没有读取权限,我无法用“fopen r”打开文件。但这意味着没有简单的方法来判断文件是否存在或无法读/写?

或者我错过了什么?任何帮助都会很棒。

谢谢!

int doesFileExist(const char* filename)
{
  FILE* fptr = fopen(filename, "r");
  if (fptr != NULL)
  {
    fclose(fptr);
    printf("File exists\n");
    return 1;
  }
  printf("File doesnt exist\n");
  return 0;
}

更新:感谢大家提供这些精彩的链接和解释!

3 个答案:

答案 0 :(得分:19)

fopen实际上会尝试打开该文件,如果您没有读取权限,则无法执行此操作。要在不打开文件的情况下检查文件是否存在,请使用stat; stat为您提供有关该文件的元数据,并且只需要对包含该文件的目录的读访问权,而不是文件本身。

int doesFileExist(const char *filename) {
    struct stat st;
    int result = stat(filename, &st);
    return result == 0;
}

如果errno不为0,则可以通过查看result获得更高级别的评分。如果errnoENOENT,则该文件不存在,如果该文件为ENOTDIR,那么您提供的部分路径不是目录,如果它是EACCESS那么你对路径中的一个目录没有读取权限,因此stat无法给你答案,等等。

另外,请注意,如果您使用符号链接(任何类Unix或Windows Vista或更高版本)的平台,您应该知道您是否要查询符号链接或它指向的文件至。如果你打电话给stat,那么你问的是它指向的文件;如果您的符号链接dir/link指向other/file,那么stat将返回other/file的结果(这通常是您想要的,因为那就是您的意思如果你打开文件会得到)。但是,如果您对链接本身感到好奇(如果您想知道" dir/link是否存在,即使other/file不存在?"),那么您应该使用{{ 1}}。

lstat()在Windows上作为兼容包装工具使用(他们更喜欢使用stat(),如果你不这样做会发出警告,但通常情况下使用本机更好平台API。在Windows上,您应该使用GetFileAttributes()

_stat()

答案 1 :(得分:1)

您实际上并未检查文件是否存在...您正在检查是否可以使用读取权限打开它。它可能由于文件不存在以外的原因而失败。如您所见,您可能没有读取权限。也可能是文件被锁定了。

检查这个答案:

What's the best way to check if a file exists in C? (cross platform)

它建议使用stat,除非您对文件所在的目录没有读取权限,否则它应该在大多数情况下都有效。

答案 2 :(得分:-1)

在Linux(和许多其他系统)上,您可以使用opendir()和朋友列出目录。我想只读文件会出现。其他平台上应该有类似的功能。