【问题标题】:Checking a file exists in C [duplicate]检查C中存在的文件[重复]
【发布时间】:2012-03-17 23:22:15
【问题描述】:

我正在尝试在 C 应用程序中打开文件。在尝试读取文件之前如何检查文件是否存在?

【问题讨论】:

标签: c file-io


【解决方案1】:

你应该检查fopen的结果。

FILE *fp;

if (!(fp = fopen(name, "r"))) {
    perror("fopen");
    /* Handle error, return, exit, try again etc. */
}

/* Normal code goes on. */

如果fopen 返回NULL,则文件由于某种原因无法访问。它可能丢失或者进程没有权限。

【讨论】:

  • ... 并检查errno 的值,了解fopen 失败的原因; ENOENT 如果文件不存在。
【解决方案2】:

你可以这样做:

bool file_exists(const char * filename) {
    if (FILE * file = fopen(filename, "r")) {
        fclose(file);
        return true;
    }
    return false;
}

基本上只要打开文件并检查它是否成功。

【讨论】:

  • 这样一个函数的问题是,在关闭文件和返回之间的间隙,答案可能会变得错误,因为文件系统是系统范围的全局可变资源。因此,当您“在尝试读取文件之前检查文件是否存在”时,您应该尽可能使用与检查时使用的文件句柄相同的文件句柄进行读取。在某些情况下,您的信息已过时并不重要,在这种情况下,您也可以使用stat(如果有)。
【解决方案3】:

你打开文件,查看fopen()open()的返回值。

【讨论】:

    【解决方案4】:

    尝试打开它:

    FILE * file;
    file = fopen("file_name", "r");
    if (file){
       //file exists and can be opened 
       //...
       // close file when you're done
       fclose(file);
    }else{
       //file doesn't exists or cannot be opened (es. you don't have access permission)
    }
    

    【讨论】:

    • "文件不存在" - 不完全遵循,它可能存在,但您无权打开它进行阅读。但提问者可能真的需要知道他是否能读懂它,这就是它告诉你的。
    • @Steve Jessop:对..感谢您指出。我确定了答案..
    • 如果它确实存在,请记住在完成时fclose(file)。当您所做的只是查看文件是否打开时,很容易忘记关闭流,但如果您不打开,那么您的应用程序和其他应用程序都无法打开文件,直到您的应用程序退出等,这是为了防止多个程序同时对同一个文件进行写操作,因为这样做没有任何意义。
    • 代码第2行存在多余的括号。
    【解决方案5】:

    存在:调用stat(),查看返回码,没有副作用。在 UNIX 上,也请致电 access()

    如果您只是按照您的要求执行此操作,FileA 是否存在,我不一定可以打开它。示例:在 UNIX 中,具有仅执行权限的文件将无法打开,但仍然存在。

    使用stat,您可以检查 st_mode 的访问权限。但是,既然您无论如何都打算打开该文件,那么fopenopen 可能就是您想要的。

    【讨论】:

    • 统计?使用权?打开?谁要求非标准的 Unix 函数?这个答案是题外话。
    • @Lundin:他也没有要求标准的非 Unix 函数。这个答案是主题。此外,它们都是 POSIX 上的标准,而 POSIX 本身一个标准。
    • @netcoder 他做到了。它被标记为 C,因此我们必须假设 OP 要求 C 语言函数。 C 语言在 ISO 标准中定义,没有其他定义。 Posix 是操作系统的标准,文件处理并不自动意味着涉及操作系统。
    • @Lundin:别那么迂腐。你假设太多了。根据您的定义,大量标记为 C 的问题不应被标记为这样,因为它们询问或回答“非 C 语言函数”。这太荒谬了。这个答案本身很有用。您似乎不太了解否决权。
    • @Lundin:把你的拖钓带到别处。 stat 一点也不晦涩。 Unix 不是 SO 上的首选操作系统。但除非 OP 要求特定的操作系统,否则我不明白为什么与最常用的操作系统(即 *NIX 和 Windows)相关的答案不是好的答案。
    【解决方案6】:

    测试文件是否存在并不难。有很多方法可以做到这一点,但在阅读了这篇文章后,我认为最好的方法是使用 stat 方法。我建议使用stat,因为我认为能够区分文件和目录很重要。我建议在 Windows 和 Unix 上都这样做。

    这里提供了两个指向 MSDN 和 opengroup 上的文档的链接。

    Windows

    Unix

    【讨论】:

      猜你喜欢
      • 2013-03-16
      • 1970-01-01
      • 2018-11-23
      • 2015-11-06
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      相关资源
      最近更新 更多