【问题标题】:C, check if a file exists without being able to read/write possible? [duplicate]C、检查文件是否存在而不能读/写可能? [复制]
【发布时间】:2012-12-06 09:20:47
【问题描述】:

可能重复:
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;
}

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

【问题讨论】:

  • 嗯..你检查过errno吗?编辑:试试这个以获得一些错误信息:printf("File doesnt exist: %s\n",strerror(errno)); 不要忘记包含errno.h 标头。
  • 这是我讨厌 stdio API 的地方,每当你需要做一些重要的事情,比如调整文件大小,或者移动文件而不复制它并删除旧文件时​​,你都不走运便携性条款。

标签: c fopen


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    检查这个答案:

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

    它建议使用stat,这在大多数情况下应该可以工作,除非您对文件所在的目录没有读取权限。

    【讨论】:

      【解决方案3】:

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

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

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

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

      stat() 在 Windows 上作为兼容性包装器工作(他们更喜欢您使用 _stat(),如果您不使用则会发出警告),但通常最好使用本机平台 API。在 Windows 上,您可能应该使用 GetFileAttributes():

      int doesFileExist(const char *filename) {
          return GetFileAttributes(filename) != INVALID_FILE_ATTRIBUTES;
      }
      

      【讨论】:

        猜你喜欢
        • 2010-09-30
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        • 2011-02-28
        • 1970-01-01
        • 2015-12-03
        • 2020-03-20
        • 1970-01-01
        相关资源
        最近更新 更多