代码之家  ›  专栏  ›  技术社区  ›  Ivan Vučica

检查是否可以使用便携式C打开文件

  •  2
  • Ivan Vučica  · 技术社区  · 17 年前

    我想快速检查一个文件是否可以打开。它应该用可移植的C编写,或者至少在win32和posix系统上工作。#ifdef是可以接受的。

    我试图避免这样的情况:

    int openable(const char*filename) {
        FILE *f = fopen(filename,"r");
        if (!f)
            return 0; /* openable */
        fclose(f);
        return 1; /* not openable */
    }
    

    根据我能告诉您的,stat()以最简单的形式,可以用来检查文件是否存在,但不能检查文件是否真正可以打开。

    3 回复  |  直到 17 年前
        1
  •  3
  •   unwind    17 年前

    POSIX标准解决方案是 access () ,它也在Windows运行时中作为 _access() .

    我想这比 fopen() + fclose() 因为:

    • 对于测试文件的访问权限问题,它是一个众所周知的标准解决方案。
    • 它可能更快,内存开销更少

    当然,它和其他任何进行这种测试的方法一样容易受到比赛条件的影响。在某种程度上,知道文件是否可供读取的唯一安全方法是打开它并尝试读取,而不在其间关闭它。当然,即便如此,你仍然需要注意“意想不到的”EOF。输入输出是硬的。

        2
  •  1
  •   MattJ    17 年前

    在知道文件是“可打开的”之前,您需要检查许多因素,并且试图以跨平台的方式检查所有这些因素是愚蠢的。

    我认为你现在所做的简单而安全。 然而 记住这是因为文件是“可打开的” 现在 但这并不意味着当你真正打开它的时候它仍然会存在。没有什么能阻止它同时发生变化。

        3
  •  1
  •   Michael Burr    17 年前

    我认为你所拥有的可能和你所得到的一样好(尽管你的评论与你应该得到的相反)。有许多事情可以阻止打开文件:权限、其他保持文件打开的东西、资源不足等。

    要准确地通过所有这些检查,你最好打开它。

    但是,还要注意,在大多数系统上,您返回的可能是对调用者的一个谎言——当您向调用者返回一个关于文件是否可以打开的指示时,系统的状态可能会发生变化(例如,以独占方式打开文件的某些操作可能会关闭文件)。因此,应用程序了解是否可以打开和使用文件的唯一真正有效的方法是打开和使用文件(并处理任何故障)。

    换句话说,如果你回来了 true '对于您的调用者,他们可以尝试打开该文件,但仍可能失败。