ifstream:如何判断指定文件是不是不存在
Posted
技术标签:
【中文标题】ifstream:如何判断指定文件是不是不存在【英文标题】:ifstream: how to tell if specified file doesn't existifstream:如何判断指定文件是否不存在 【发布时间】:2010-12-11 11:29:09 【问题描述】:我想打开一个文件进行阅读。但是,在这个程序的上下文中,如果文件不存在也没关系,我继续前进。我希望能够识别错误何时是“找不到文件”以及何时错误。否则意味着我需要退出并出错。
我没有看到使用fstream
的明显方法。
我可以用 C 的 open()
和 perror()
做到这一点。我猜想也有fstream
的方法可以做到这一点。
【问题讨论】:
【参考方案1】:编辑:我已被告知这并不一定表示文件不存在,因为它也可能由于访问权限或其他问题而被标记。
我知道我回答这个问题已经很晚了,但我想我还是会为任何浏览的人留下评论。您可以使用 ifstream 的失败指示器来判断文件是否存在。
ifstream myFile("filename.txt");
if(myFile.fail())
//File does not exist code here
//otherwise, file exists
【讨论】:
您的建议不是检查“找不到文件”的方法。fail()
不表示“文件不存在”,它只是表示“有问题”。在您的特定示例中,它可以是“拒绝访问”或“共享违规”等。
很好,我什至没有考虑到这一点。我会修改回复,以便人们知道。【参考方案2】:
我认为您无法知道“文件不存在”。您可以使用 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
【讨论】:
不是ofstream而是ifstream! 请注意,两种方式都会检查其他内容:文件可能存在,但您可能没有必要的权限... 这不是一个天生的解决方案吗? 来自this线程,还有file.good()
选项,我觉得这里更合适。
boost::filesystem::exists
已在 C++17 中添加为 std::filesystem::exists
。【参考方案3】:
由于打开文件的结果是特定于操作系统的,我认为标准 C++ 没有任何方法可以区分各种类型的错误。文件要么打开,要么不打开。
您可以尝试打开文件进行读取,如果它没有打开(ifstream::is_open()
返回false
),您知道它要么不存在,要么发生了其他错误。再说一次,如果你之后尝试打开它进行写作,但它失败了,那可能属于“其他”类别。
【讨论】:
【参考方案4】:http://www.cplusplus.com/forum/general/1796/的简单方法
ifstream ifile(filename);
if (ifile)
// The file exists, and is open for input
【讨论】:
如果其他人想知道:According to the documentation,这与!ifile.fail()
相同。 if(!ifile)
等价于 ifile.fail()
。【参考方案5】:
您可以使用 stat,它应该可以跨平台移植并且在标准 C 库中:
#include <sys/stat.h>
bool FileExists(string filename)
struct stat fileInfo;
return stat(filename.c_str(), &fileInfo) == 0;
如果 stat 返回 0,则文件(或目录)存在,否则不存在。我假设您必须对文件路径中的所有目录具有访问权限。我还没有测试过可移植性,但this page 表示这应该不是问题。
【讨论】:
应该明确地检查返回码,因为它可能因为文件不存在以外的原因非零。见pubs.opengroup.org/onlinepubs/009695399/functions/stat.html 这是一个错误的做法,因为在 stat() 返回和fstream
的 open() 实际打开文件之前,该文件可能已经消失(已删除由系统中的另一个进程)。
***.com/questions/12774207/…【参考方案6】:
更好的方法:
std::ifstream stream;
stream.exceptions(std::ifstream::failbit | std::ifstream::badbit);
stream.open(fileName, std::ios::binary);
【讨论】:
请补充说明/references.【参考方案7】:让我举个实际运行的例子:
-
文件不存在:
-
文件存在:
有关其公共功能的更多信息,请参阅http://www.cplusplus.com/reference/fstream/ifstream/。
【讨论】:
这不考虑文件实际存在但访问它时出现错误的可能性,例如权限被拒绝、I/O 错误等【参考方案8】:直接不创建ifstream对象。
if (!std::ifstream(filename))
// error! file doesn't exist.
【讨论】:
这将创建一个ifstream
对象,它只是在if
语句完成后立即超出范围的对象以上是关于ifstream:如何判断指定文件是不是不存在的主要内容,如果未能解决你的问题,请参考以下文章