C++中最快的检查文件是否存在的方法是什么?

3

判断文件是否存在有多种方法。

我知道的选项包括:

  1. boost::filesystem exists()
  2. access()
  3. stat()
  4. ifstream is_open()

有没有人知道这些中哪个具有最高的性能?

编辑:假设运行在 /dev/shm 上,其中访问时间不是一个因素。


11
我猜他们的速度都差不多。因为运行时间会被硬盘或固态硬盘的寻道延迟所主导。 - Mysticial
2
始终根据您的条件进行性能分析。我可以告诉您我认为哪个最快,但是如果我只是随意选择一个答案,或者我用来评判答案的条件与您完全不同,那么您就无法知道。 - Retired Ninja
我的赌注会放在stat()上,因为它是一个系统调用。 - squiguy
3
下一步你会做什么——阅读还是写入你正在寻找的同一文件?如果是这样,请不要首先进行检查,只执行读取或写入操作。在读写之前进行存在性检查容易出现竞态条件(例如,当你打开文件时,文件可能看起来存在,但实际上并不存在,反之亦然)。如果文件位于慢速访问点(如网络)上,则你需要付出不必要的两倍代价:一次是去设备寻找文件,另一次则是实际尝试写入它时。 (对于打开以供读取的操作也可能有惩罚,但如果系统中有缓存,则可能不会有惩罚。) - Kevin Grant
3
锁住它并处理异常。如果你检查文件存在的时间和尝试获取锁的时间之间文件消失了怎么办?(即使它们在程序中是相邻语句,这也可能发生!)你必须准备好无论如何处理异常,所以你最好让程序简单化,不要担心特殊情况。 - Rob Kennedy
显示剩余3条评论
2个回答

7

在这里,运行时间将受到切换到内核模式和文件系统驱动程序的影响——即使忽略磁盘时间。很有可能它们中没有一个能提供更好的性能。最好选择提供最佳接口的一个——boost::filesystem


2

现代C++ | 更新

C++17提供了这个std函数:

#include <filesystem>

int main()
{
    std::filesystem::path FullPath("C:\\Test.txt");

    bool bExists = std::filesystem::exists(FullPath);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接