【问题标题】:Checking for file existence in C++在 C++ 中检查文件是否存在
【发布时间】:2011-04-07 00:39:21
【问题描述】:

目前我使用类似的东西:

#include <sys/stat.h>

#include "My_Class.h"

void My_Class::my_function(void)
{
  std::ofstream my_file;

  struct stat file_info; 

  if ( filename_str.compare("")!=0  &&
       stat(filename_str.c_str(),&file_info) == 0 )
  {
    my_file.open(filename_str.data(),std::ios::trunc);
    //do stuff
    my_file.close(); 
  }
  else if ( filename_str.compare("")==0 )
  {
    std::cout << "ERROR! ... output filename not assigned!" << std::endl;
  }
  else
  {
    std::cout << "ERROR! File :" << std::endl
          << filename_str << std::endl 
          << "does not exist!!" << std::endl;
  }
}

...这是一个不错的选择,还是有更好的选择?如果我没有读取文件的权限,似乎我可以运行大量权限。

这不是作业,问题,而是关于最佳实践的问题。

【问题讨论】:

    标签: c++ file-io filesystems file-permissions


    【解决方案1】:

    从概念上讲,这取决于您打算如何处理该文件..

    • 如果您需要它的内容,请继续尝试打开它,并准备好优雅地处理故障,原因 Ken 详述。
    • 如果您当前对它的内容不感兴趣(例如,在枚举目录内容时,或者只打算在未来某个时间访问文件等),您最好现在只检查属性。否则,诸如分层存储管理之类的讨厌的事情可能会触发从磁带备份或网络(而属性可能已被缓存)中调用昂贵(=缓慢)的文件内容。您可以尝试通过检查各自的文件属性来避免这种情况,但这也是额外的复杂性。

    因此,作为最佳实践,我建议谨慎打开文件(即,如果您对内容不立即感兴趣,请自行处理基于文件属性的信息),并严格根据实际情况处理失败在需要时打开文件的调用。

    【讨论】:

      【解决方案2】:

      我会使用 boost::filesystem 构造。它们不仅是跨平台的,而且是下一个标准库的一部分。

      【讨论】:

      • 我知道至少有一位前工作场所的资深程序员说 Boost 是一场火车事故,但我承认我没有完全理解/听到他们关于原因的逻辑。你认为这是个好主意吗?
      • @Jason:想一想那个。如果@Noah 认为这是火车残骸,为什么他会回答推荐 Boost?
      • 可能是因为 Boost 会使调试变得有些困难?我不太确定 - Boost 一直对我和我的朋友都很好。
      • 好吧,如果你真的很了解某件事,你也可以理解它的批评。例如,我可以看到我使用的某些分子动力学软件包由于某些原因可能在哪里受到诽谤或赞扬,并且可以传达这种推理,无论我是否推荐该产品......
      • 我也在某个“老手”声称类似事情的地方工作过。不会让我们使用提升。基本上是这样的原因:异常很慢,模板导致膨胀,而且我害怕任何我没有亲自编写的硬编码数组边界和具有众所周知问题的 C 函数。有时人们是老手,只是因为他们说服了对编程一无所知的人。在从未见过手机的人中成为上帝很容易。
      【解决方案3】:

      通常我认为最好尝试打开它并发现错误。

      IMO,检查权限是不明智的,因为如果它是一个 Linux 机器并且您检查它的属性,决定您不能写入它,但是文件系统支持 ACL 并且他们确实授予您权限怎么办? (作为系统管理员,当应用程序执行此操作时,我无法忍受。我喜欢 ACL,如果您是应用程序,请不要告诉我您无法写入文件,除非您尝试过首先。)

      【讨论】:

      • 遵循口头禅,“保持简单..”。如果您的代码看起来复杂或不简单,很可能是这样。
      • 所以只需使用一个简单的 try{ } catch 块?
      • 我尝试了这段代码...java2s.com/Tutorial/Cpp/0240__File-Stream/… ....但是当文件不存在时,我的可执行文件不断将空行转储到我的终端。为什么该示例不起作用的想法?我从字面上将它复制并粘贴到一个 main.cc 文件中,然后运行没有标志的 g++ 并运行生成的可执行文件。
      猜你喜欢
      • 1970-01-01
      • 2013-09-19
      • 2013-06-04
      • 2016-02-23
      • 2017-04-24
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多