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:如何判断指定文件是不是不存在的主要内容,如果未能解决你的问题,请参考以下文章

java判断文件是不是存在不存在就创建

JQuery js如何判断标签指定属性是不是存在

RUBY语言怎么判断指定目录是不是存在

C语言判断指定文件是不是存在

如何用vb.net实现:判断指定路径下是不是存在指定文件

jq如何判断是不是存在某个指定的style样式