【发布时间】:2010-12-11 11:29:09
【问题描述】:
我想打开一个文件进行阅读。但是,在这个程序的上下文中,如果文件不存在也没关系,我继续前进。我希望能够识别错误何时是“找不到文件”以及何时错误。否则意味着我需要退出并出错。
我没有看到使用fstream 的明显方法。
我可以用 C 的 open() 和 perror() 做到这一点。我猜想也有fstream 的方法可以做到这一点。
【问题讨论】:
我想打开一个文件进行阅读。但是,在这个程序的上下文中,如果文件不存在也没关系,我继续前进。我希望能够识别错误何时是“找不到文件”以及何时错误。否则意味着我需要退出并出错。
我没有看到使用fstream 的明显方法。
我可以用 C 的 open() 和 perror() 做到这一点。我猜想也有fstream 的方法可以做到这一点。
【问题讨论】:
编辑:我已被告知这并不一定表示文件不存在,因为它也可能由于访问权限或其他问题而被标记。
我知道我回答这个问题已经很晚了,但我想我还是会为任何浏览的人留下评论。您可以使用 ifstream 的失败指示器来判断文件是否存在。
ifstream myFile("filename.txt");
if(myFile.fail()){
//File does not exist code here
}
//otherwise, file exists
【讨论】:
fail() 不表示“文件不存在”,它只是表示“有问题”。在您的特定示例中,它可以是“拒绝访问”或“共享违规”等。
我认为您无法知道“文件不存在”。您可以使用 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
}
}
【讨论】:
file.good()选项,我觉得这里更合适。
boost::filesystem::exists 已在 C++17 中添加为 std::filesystem::exists。
由于打开文件的结果是特定于操作系统的,我认为标准 C++ 没有任何方法可以区分各种类型的错误。文件要么打开,要么不打开。
您可以尝试打开文件进行读取,如果它没有打开(ifstream::is_open() 返回false),您知道它要么不存在,要么发生了其他错误。再说一次,如果你之后尝试打开它进行写作,但它失败了,那可能属于“其他”类别。
【讨论】:
http://www.cplusplus.com/forum/general/1796/的简单方法
ifstream ifile(filename);
if (ifile) {
// The file exists, and is open for input
}
【讨论】:
!ifile.fail() 相同。 if(!ifile) 等价于 ifile.fail()。
您可以使用 stat,它应该可以跨平台移植并且在标准 C 库中:
#include <sys/stat.h>
bool FileExists(string filename) {
struct stat fileInfo;
return stat(filename.c_str(), &fileInfo) == 0;
}
如果 stat 返回 0,则文件(或目录)存在,否则不存在。我假设您必须对文件路径中的所有目录具有访问权限。我还没有测试过可移植性,但this page 表示这应该不是问题。
【讨论】:
fstream 的 open() 实际打开文件之前,该文件可能已经消失(已删除由系统中的另一个进程)。
更好的方法:
std::ifstream stream;
stream.exceptions(std::ifstream::failbit | std::ifstream::badbit);
stream.open(fileName, std::ios::binary);
【讨论】:
【讨论】:
直接不创建ifstream对象。
if (!std::ifstream(filename))
{
// error! file doesn't exist.
}
【讨论】:
ifstream 对象,它只是在if 语句完成后立即超出范围的对象