我想打开一个文件进行读取。但是,在这个程序的上下文中,如果文件不存在,我就继续。我希望能够识别何时出现错误“文件未找到”以及何时出错。否则意味着我需要退出并出错。ifstream:如何判断指定文件是否存在
我没有看到一个明显的方式与fstream
做到这一点。
我可以做到这一点C'S open()
和perror()
。我推测有一个fstream
的方式来做到这一点。
我想打开一个文件进行读取。但是,在这个程序的上下文中,如果文件不存在,我就继续。我希望能够识别何时出现错误“文件未找到”以及何时出错。否则意味着我需要退出并出错。ifstream:如何判断指定文件是否存在
我没有看到一个明显的方式与fstream
做到这一点。
我可以做到这一点C'S open()
和perror()
。我推测有一个fstream
的方式来做到这一点。
由于打开文件的结果和具体的操作系统,我不认为标准C++有任何方法来区分各种类型的错误。该文件可以打开或不打开。
您可以尝试打开文件进行阅读,如果文件未打开,您知道它不存在或发生其他错误。然后再次,如果您尝试打开后继写入而失败,则可能属于“其他”类别。
我不认为你可以知道“该文件不存在”。你可以使用IS_OPEN()为通用检查:
ofstream file(....);
if(!file.is_open())
{
// error! maybe the file doesn't exist.
}
如果您正在使用boost
你可以使用boost::filesystem
:
#include <boost/filesystem.hpp>
int main()
{
boost::filesystem::path myfile("test.dat");
if(!boost::filesystem::exists(myfile))
{
// what do you want to do if the file doesn't exist
}
}
您可以使用统计,这应该是跨平台移植,是在标准C库:
#include <sys/stat.h>
bool FileExists(string filename) {
struct stat fileInfo;
return stat(filename.c_str(), &fileInfo) == 0;
}
如果stat将会返回0,文件(或目录)存在,否则就没有。我假设你必须拥有文件路径中所有目录的访问权限。我没有测试可移植性,但this page表明它不应该是一个问题。
应明确检查返回码,因为除文件以外的原因,它可能不为零。见http://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html – gerardw 2013-10-11 12:04:00
这是一个错误的事情,因为在AFTER返回的时间和之前'fstream'的open()得到实际上打开文件的文件可能已经不存在了(被系统中的另一个进程删除)。 – PowerGamer 2015-01-05 12:11:55
http://stackoverflow.com/questions/12774207/fastest-way-to-check-if-a-file-exist-using-standard-c-c11-c – Ethan 2016-02-16 03:30:33
编辑:我已收到通知,这并不一定表示文件不存在,因为它可能会由于访问权限或其他问题而被标记。
我知道我在回答这个问题时非常迟,但我想我会留下一条评论,无论如何,任何人浏览。您可以使用ifstream的失败指示器来判断文件是否存在。
ifstream myFile("filename.txt");
if(myFile.fail()){
//File does not exist code here
}
//otherwise, file exists
感谢您的“迟到”答案!我发布它非常有用;) – ezdazuzena 2013-04-05 10:23:46
非常有用!非常感谢 – 2014-08-22 13:42:42
你的建议不是检查“文件未找到”的方法。 'fail()'不表示“文件不存在”,它只是表示“有问题”。在你的特定例子中,它可以是“拒绝访问”或“共享违规”等。 – PowerGamer 2015-01-05 12:18:16
一个简单的方法从http://www.cplusplus.com/forum/general/1796/
ifstream ifile(filename);
if (ifile) {
// The file exists, and is open for input
}
功能std::fstream::good()
返回false
当文件不存在。这还不够吗?
std::fstream
继承此功能从std::ios
。
它不是正流,而是流! – Phong 2010-10-15 05:30:42
请注意,这两种方式检查别的东西:该文件可能在那里,但你可能没有必要的权限... – rubenvb 2013-10-24 15:00:25
这不是一个本质上激烈的解决方案? – 2014-04-15 09:03:54