我已阅读以下答案:什么是检查C中是否存在文件的最佳方法?(跨平台),但我想知道是否存在使用标准c ++库执行此操作的更好方法?最好不要尝试完全打开文件。
两者stat
和access
几乎是不可谷歌的。我#include
该怎么用?
我已阅读以下答案:什么是检查C中是否存在文件的最佳方法?(跨平台),但我想知道是否存在使用标准c ++库执行此操作的更好方法?最好不要尝试完全打开文件。
两者stat
和access
几乎是不可谷歌的。我#include
该怎么用?
Answers:
#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
我是一个非常高兴的推动者,一定会使用Andreas的解决方案。但是,如果您无权访问boost库,则可以使用流库:
ifstream file(argv[1]);
if (!file)
{
// Can't open file
}
它不像boost :: filesystem :: exists那样好,因为该文件实际上会被打开...但是,无论如何,这通常是接下来要做的事情。
如果stat()跨平台足以满足您的需求,请使用它。它不是C ++标准,而是POSIX。
在MS Windows上有_stat,_stat64,_stati64,_wstat,_wstat64,_wstati64。
如果您的编译器支持C ++ 17,则不需要升压,只需使用 std::filesystem::exists
#include <iostream> // only for std::cout
#include <filesystem>
if (!std::filesystem::exists("myfile.txt"))
{
std::cout << "File not found!" << std::endl;
}
没有 促进要求,这将是一个过大的杀伤力。
使用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...
可以在此处找到另一个版本。
如果您已经在使用输入文件流类(ifstream
),则可以使用其功能fail()
。
例:
ifstream myFile;
myFile.open("file.txt");
// Check for errors
if (myFile.fail()) {
cerr << "Error: File could not be found";
exit(1);
}