检查C ++文件是否存在的最佳方法是什么? (跨平台)
我已经阅读了什么是检查C文件是否存在的最佳方法? (跨平台) ,但我想知道是否有更好的方法来使用标准的C ++库做这个? 最好不要试图打开文件。
stat
和access
都是非常可用的。 我应该包括什么#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。