C++ 检查C+中是否存在文件+;

C++ 检查C+中是否存在文件+;,c++,file-io,filesystems,file-permissions,C++,File Io,Filesystems,File Permissions,目前我使用的是: #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

目前我使用的是:

#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;
  }
}
#包括
#包括“My_Class.h”
void My_类::My_函数(void)
{
std::流我的_文件;
结构统计文件信息;
如果(文件名\u str.compare(“”)=0&&
stat(filename_str.c_str(),&file_info)==0)
{
my_file.open(filename_str.data(),std::ios::trunc);
//做事
my_file.close();
}
else if(filename_str.compare(“”==0)
{

std::cout一般来说,我认为最好打开它并捕捉错误


在我看来,检查权限是不明智的,因为如果它是一个Linux框,并且您检查了它的属性,然后决定您不能对它进行写入,但是文件系统支持ACL,并且它们确实授予您权限,该怎么办?(作为系统管理员,我无法忍受应用程序会这样做。我喜欢ACL,如果你是一个应用程序,不要告诉我你不能写入文件,除非你先尝试过。)

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

从概念上讲,这取决于您计划如何处理该文件

  • 如果您需要它的内容,请继续尝试打开它,并准备优雅地处理失败,原因如下
  • 如果您当前对其内容不感兴趣(例如,在枚举目录内容时,或仅计划在将来某个时候访问文件等),您最好现在就检查属性。否则,像分层存储管理这样的讨厌的事情可能会触发昂贵的(=缓慢)从磁带备份或网络中调用文件内容(而属性可能已被缓存)。您可以通过检查相应的文件属性来避免这种情况,但这也会增加复杂性

因此,作为一种最佳做法,我建议谨慎地打开文件(即,如果您对内容不感兴趣,请与基于文件属性的信息进行斗争),并严格按照实际调用处理故障,以便在需要时打开文件。

遵循咒语“保持简单…”。如果您的代码看起来很复杂或不简单,很可能是。所以只需使用简单的try{}catch block?我尝试了这段代码……但当文件不存在时,我的可执行文件会不断地将空行转储到我的终端。关于为什么该示例不起作用的想法?我将其复制并粘贴到main.cc文件中,然后只运行g++而不带任何标志,然后运行生成的可执行文件。我知道至少有一位资深的程序员在以前的工作区工作我说Boost是火车失事,但我承认我没有完全理解/听到他们的逻辑为什么。你认为这是个好主意吗?@Jason:想一想。如果他认为Boost是火车失事,为什么@Noah会回答建议Boost?可能是因为Boost会使调试有些困难?我不太确定-Boost一直都是对我和我的朋友们好。如果你真的很了解某件事,你也可以理解它的批评。例如,我可以看到我使用的一些分子动力学软件包可能会因为某些原因受到诽谤或赞扬,并且可以传达这种理据,无论我是否推荐该产品……我还在在一个“老兵”声明了类似的事情。不允许我们使用boost。原因基本上是:异常速度慢,模板会导致膨胀,我害怕任何我没有亲自编写的硬编码数组边界和C函数,以及众所周知的问题。有时人们是老手,只是因为他们说服了对这些问题一无所知的人他们做的编程。在从未见过手机的人中,成为神是很容易的。