首页 > 解决方案 > 如何确定 std::filesystem::remove_all 是否失败?

问题描述

我正在尝试使用的非抛出版本std::filesystem::remove_all,我有类似的东西:

bool foo()
{
  std::error_code ec;
  std::filesystem::remove_all(myfolder, ec);

  if (ec.value())
  {
    // failed to remove, return
    return false;
  }
}

这是正确的使用方法error_code吗?

我的推理:

我读了这个

如果 OS API 调用失败,采用 std::error_code& 参数的重载将其设置为 OS API 错误代码,并执行 ec.clear()

现在在这里

clear - 在 system_category 中将 error_code 设置为值 0

现在我用这个来暗示error_code == 0 => No error. error_code != 0 => error

我真的没有太多使用的例子error_code。我只想确定是否所有文件都已删除。

标签: c++std

解决方案


ec.value()和之间有区别ec != std::error_code{};如果错误代码中的错误代码ec与系统错误的错误类别不同并且值为0,则第一个将返回 false,而第二个将返回 true。

错误代码是类别和值的元组。只看值是一点点“代码味道”。

在这种情况下,我认为错误代码除了系统类别之外不可能有任何内容。对于非系统错误类别,将值 0 用于实际错误将是一种不好的形式。

如果没有带有非系统错误代码的错误(值 0),则将其视为错误可能是个坏主意。所以也许你不应该检查类别。

最后,if (ec.value())是一种冗长的说法if (ec)。我会使用explicit operator bool() const而不是调用.value().

另一种选择是:

if (-1 == std::filesystem::remove_all(myfolder, ec)) {
  // failed to remove, return
  return false;
}

推荐阅读