c++ - is_regular_file 之后我有什么保证?

标签 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)
{
  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()),打开文件失败

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

关于c++ - is_regular_file 之后我有什么保证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36022189/

相关文章:

c++ - 使用模板打印任何容器的所有数据

c++ - 如何使用boost序列化?

c++ - 如何使用 Boost Filesystem 忽略隐藏文件(和隐藏目录中的文件)?

c++ - 使用 boost::filesystem 遍历目录而不抛出异常

c++ - 如何在 V8 中存储持久句柄?

c++ - 为什么 CMake 在 Ubuntu 18.04 上找不到我的 Boost 库?

c++ - 为什么这种理论上跨平台的代码不会改变 Windows 上的环境变量?

c++ - boost::filesystem::path 和 fopen()

c++ - 比较 std::strings 的最佳方法

c++ - 如何找出路径是否满足某个父级?