检查C ++文件是否存在的最佳方法是什么? (跨平台)

我已经阅读了什么是检查C文件是否存在的最佳方法? (跨平台) ,但我想知道是否有更好的方法来使用标准的C ++库做这个? 最好不要试图打开文件。

stataccess都是非常可用的。 我应该包括什么#include使用这些?

使用boost :: filesystem :

 #include <boost/filesystem.hpp> if ( !boost::filesystem::exists( "myfile.txt" ) ) { std::cout << "Can't find my file!" << std::endl; } 

注意竞争条件:如果文件在“存在”检查和打开它之间消失,程序将意外失败。

最好去打开文件,检查失败,如果一切正常,那就对文件进行一些操作。 安全关键的代码更重要。

有关安全性和竞争条件的详细信息: http : //www.ibm.com/developerworks/library/l-sprace.html

我是一个快乐的提升用户,肯定会使用安德烈亚斯的解决scheme。 但是,如果您无法访问boost库,则可以使用stream库:

 ifstream file(argv[1]); if (!file) { // Can't open file } 

它不像boost :: filesystem :: exists那么好,因为文件实际上会被打开……但是这通常是你想要做的下一件事情。

使用stat(),如果它足够满足您的需求。 这不是C ++标准,但POSIX。

在MS Windows上有_stat,_stat64,_stati64,_wstat,_wstat64,_wstati64。

如何access

 #include <io.h> if (_access(filename, 0) == -1) { // File does not exist } 

我会重新考虑试图找出一个文件是否存在。 相反,你应该尝试打开它(在标准的C或C + +)在你打算使用它相同的模式。 有什么用处是知道该文件存在,如果它是不可写的,当你需要使用它?

另一种可能性是在stream中使用good()函数:

 #include <fstream> bool checkExistence(const char* filename) { ifstream Infield(filename); return Infield.good(); } 

没有提高必要的 ,这将是一个矫枉过正


使用stat() (不像pavon提到的跨平台),如下所示:

 #include <sys/stat.h> #include <iostream> // true if file exists bool fileExists(const std::string& file) { struct stat buf; return (stat(file.c_str(), &buf) == 0); } int main() { if(!fileExists("test.txt")) { std::cerr << "test.txt doesn't exist, exiting...\n"; return -1; } return 0; } 

输出:

 C02QT2UBFVH6-lm:~ gsamaras$ ls test.txt ls: test.txt: No such file or directory C02QT2UBFVH6-lm:~ gsamaras$ g++ -Wall main.cpp C02QT2UBFVH6-lm:~ gsamaras$ ./a.out test.txt doesn't exist, exiting... 

另一个版本(和)可以在这里find。