C++ 我有什么保证后,是正常的文件?

C++ 我有什么保证后,是正常的文件?,c++,boost-filesystem,C++,Boost Filesystem,考虑到一个boost::filesystem::path p,是否有可能同时拥有boost::filesystem::is_regular_file(p)==true和std::ifstream(p.c_str())。is_open()==false?如果是,在哪种情况下 上下文是为比较函数编写断言: bool identical_files(const boost::filesystem::path& p1, const boost::filesystem::path& p2)

考虑到一个
boost::filesystem::path p
,是否有可能同时拥有
boost::filesystem::is_regular_file(p)==true
std::ifstream(p.c_str())。is_open()==false
?如果是,在哪种情况下

上下文是为比较函数编写断言:

bool identical_files(const boost::filesystem::path& p1, const boost::filesystem::path& p2)
{
  assert(boost::filesystem::is_regular_file(p1));
  assert(boost::filesystem::is_regular_file(p2));
  std::ifstream f1(p1.c_str());
  assert(f1.is_open()); // IS THIS REDUNDANT ???
  std::ifstream f2(p2.c_str());
  assert(f2.is_open());
  // ...
  // ...
  // ...
}

您唯一能保证的是,在调用时,路径是一个常规文件。因为文件系统隐式地是一个竞争条件,所以
boost::filesystem::is_regular_file(p1)
std::ifstream f1(p1.c_str())
之间的调用实际上可能指的是两个不同的对象

考虑以下场景:

  • 进程1调用
    boost::filesystem::is_regular_file(p1)
    ,成功并确定它是“普通”文件
  • 进程2删除由
    p1
  • 进程1调用std::ifstream f1(p1.c_str()),无法打开文件

你能在这里看到竞争条件吗?

如果进程没有访问目标文件的权限,它也可能失败;该文件将存在,但打开它将失败。
是常规文件
检查也不包括FIFO和字符设备。感谢这个具体示例。在我的例子中,我更喜欢忽略并发问题,因为它可能从未在多线程上下文中使用过。我的问题更多的是关于同一个文件,而不是第三方试图捕获我的代码但是三十二上校的回答与我的情况有关。我发现对于大多数文件系统操作来说,请求原谅比许可更好的范例效果最好(与三思而后行范例相反)。在您的情况下,这意味着
是常规文件(p1)
是一个冗余检查,因为您始终需要
f1.is\u open(),您可以利用短路:
如果(f1.is\u open()和f1.is\u regular\u file())
@Escualo不能保证您打开的流与
is\u regular\u file()正在检查的对象相同。特别是在linux上,您可以删除仍在使用的对象(inode)的路径,并在旧路径上创建新的inode。然后,新的文件系统操作在新的inode上运行,而不是在旧的inode上运行,而在旧的inode上的操作(例如,从该流中读取)继续正常运行……1)您可以使用
assert
进行检查,因此它对发布版本不重要,因此它也不重要。2.)只需比较相同文件的路径,因为(例如linux)很多东西都是文件。