【问题标题】:ifstream: how to tell if specified file doesn't existifstream:如何判断指定文件是否不存在
【发布时间】:2010-12-11 11:29:09
【问题描述】:

我想打开一个文件进行阅读。但是,在这个程序的上下文中,如果文件不存在也没关系,我继续前进。我希望能够识别错误何时是“找不到文件”以及何时错误。否则意味着我需要退出并出错。

我没有看到使用fstream 的明显方法。


我可以用 C 的 open()perror() 做到这一点。我猜想也有fstream 的方法可以做到这一点。

【问题讨论】:

    标签: c++ file


    【解决方案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
      }
      

      【讨论】:

      【解决方案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 表示这应该不是问题。

      【讨论】:

      【解决方案6】:

      更好的方法:

      std::ifstream stream;
      stream.exceptions(std::ifstream::failbit | std::ifstream::badbit);
      stream.open(fileName, std::ios::binary);
      

      【讨论】:

      【解决方案7】:

      让我举个实际运行的例子:

      1. 文件不存在:

      1. 文件存在:

      有关其公共功能的更多信息,请参阅http://www.cplusplus.com/reference/fstream/ifstream/

      【讨论】:

      • 这不考虑文件实际存在但访问它时出现错误的可能性,例如权限被拒绝、I/O 错误等
      【解决方案8】:

      直接不创建ifstream对象。

      if (!std::ifstream(filename))
      {
           // error! file doesn't exist.
      }
      

      【讨论】:

      • 这将创建一个ifstream 对象,它只是在if 语句完成后立即超出范围的对象
      猜你喜欢
      • 2011-07-14
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 2010-09-17
      • 2021-07-26
      • 2013-10-31
      • 1970-01-01
      相关资源
      最近更新 更多