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

时间:2009-03-16 14:47:07

标签: c file-io

我想快速检查一下文件是否可以打开。它应该用便携式C编写,或至少用于Win32和POSIX系统。 #ifdefs是可以接受的。

我试图避免这种情况:

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

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

3 个答案:

答案 0 :(得分:3)

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

我猜它比fopen() + fclose()好得多,因为:

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

当然,它与其他任何进行此类测试的方式一样容易受到竞争条件的影响。在某种程度上,知道文件是否可用于阅读的唯一安全方法是打开它并尝试阅读,而不是在它们之间关闭它。即使这样,你仍然需要注意“意外”的EOF,当然。 I / O很难。

答案 1 :(得分:1)

在您知道某个文件是“可打开”之前,您需要检查许多因素,并尝试以跨平台方式检查它们将是愚蠢的。

我认为你现在所做的事情既简单又安全。 然而请记住,仅仅因为文件是“可打开的”现在并不意味着它仍然会在您真正打开它时。在此期间,没有什么能阻止它发生变化。

答案 2 :(得分:1)

我认为你拥有的东西可能和你一样好(尽管你的评论与他们的评论相反)。有很多东西可以阻止文件打开:权限,其他东西保持打开,缺乏资源等。

要准确地完成所有这些检查,你也可以打开它。

但是,请注意,在大多数系统上,您返回的内容可能是调用者的谎言 - 当您向调用者返回关于文件是否可以打开的指示时,系统的状态可以改变(例如,将文件打开的东西可能会关闭它)。因此,应用程序知道是否可以打开和使用文件的唯一真正有效的方法是打开并使用该文件(并处理任何故障)。

换句话说,如果您向调用者返回“true”,他们可能会尝试打开该文件,但可能仍会失败。