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

时间:2010-09-01 20:47:05

标签: 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 )
  {
    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;
  }
}

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

这不是一个功课,问题,这是一个关于最佳实践的问题。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

一般来说,我认为最好只是尝试打开它并发现错误。

IMO,检查权限是不明智的,因为如果它是一个Linux框并且你检查它的属性,决定你不能写它,但文件系统支持ACL,他们授予你许可? (作为系统管理员,当应用程序执行此操作时,我无法站立。我喜欢ACL,如果您是应用程序,请不要告诉我除非您尝试过,否则无法写入文件第一。)

答案 2 :(得分:0)

从概念上讲,我会说这取决于你打算用这个文件做什么..

  • 如果你需要它的内容,请继续尝试打开它,并准备妥善处理失败,原因肯详细。
  • 如果您当前对其内容不感兴趣(例如,在枚举目录内容时,或者仅计划在将来的某个时间点访问文件等),那么您最好现在只检查属性。否则,诸如分层存储管理之类的令人讨厌的事情可能会触发从磁带备份或网络中调用文件内容的昂贵(=慢速)(而属性可能已被缓存)。您可以尝试通过检查相应的文件属性来避免这种情况,但这也是一种额外的复杂性。

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