2009-10-30 39 views
28

我想打开一个文件进行读取。但是,在这个程序的上下文中,如果文件不存在,我就继续。我希望能够识别何时出现错误“文件未找到”以及何时出错。否则意味着我需要退出并出错。ifstream:如何判断指定文件是否存在

我没有看到一个明显的方式与fstream做到这一点。


我可以做到这一点C'S open()perror()。我推测有一个fstream的方式来做到这一点。

回答

5

由于打开文件的结果和具体的操作系统,我不认为标准C++有任何方法来区分各种类型的错误。该文件可以打开或不打开。

您可以尝试打开文件进行阅读,如果文件未打开,您知道它不存在或发生其他错误。然后再次,如果您尝试打开后继写入而失败,则可能属于“其他”类别。

36

我不认为你可以知道“该文件不存在”。你可以使用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 
    } 
} 
+6

它不是正流,而是流! – Phong 2010-10-15 05:30:42

+0

请注意,这两种方式检查别的东西:该文件可能在那里,但你可能没有必要的权限... – rubenvb 2013-10-24 15:00:25

+3

这不是一个本质上激烈的解决方案? – 2014-04-15 09:03:54

5

您可以使用统计,这应该是跨平台移植,是在标准C库:

#include <sys/stat.h> 

bool FileExists(string filename) { 
    struct stat fileInfo; 
    return stat(filename.c_str(), &fileInfo) == 0; 
} 

如果stat将会返回0,文件(或目录)存在,否则就没有。我假设你必须拥有文件路径中所有目录的访问权限。我没有测试可移植性,但this page表明它不应该是一个问题。

+0

应明确检查返回码,因为除文件以外的原因,它可能不为零。见http://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html – gerardw 2013-10-11 12:04:00

+2

这是一个错误的事情,因为在AFTER返回的时间和之前'fstream'的open()得到实际上打开文件的文件可能已经不存在了(被系统中的另一个进程删除)。 – PowerGamer 2015-01-05 12:11:55

+0

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

39

编辑:我已收到通知,这并不一定表示文件不存在,因为它可能会由于访问权限或其他问题而被标记。

我知道我在回答这个问题时非常迟,但我想我会留下一条评论,无论如何,任何人浏览。您可以使用ifstream的失败指示器来判断文件是否存在。

ifstream myFile("filename.txt"); 
    if(myFile.fail()){ 
     //File does not exist code here 
    } 
//otherwise, file exists 
+2

感谢您的“迟到”答案!我发布它非常有用;) – ezdazuzena 2013-04-05 10:23:46

+0

非常有用!非常感谢 – 2014-08-22 13:42:42

+2

你的建议不是检查“文件未找到”的方法。 'fail()'不表示“文件不存在”,它只是表示“有问题”。在你的特定例子中,它可以是“拒绝访问”或“共享违规”等。 – PowerGamer 2015-01-05 12:18:16

0

功能std::fstream::good()返回false当文件不存在。这还不够吗?

std::fstream继承此功能从std::ios

相关问题