如何判断std::filesystem::remove_all是否失败?

How to determine if std::filesystem::remove_all failed?

我正在尝试使用 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的正确使用方法吗?

我的推理:

我读了this:

The overload taking a std::error_code& parameter sets it to the OS API error code if an OS API call fails, and executes ec.clear()

现在here:

clear - sets the error_code to value 0 in system_category

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

error_code 的用法我实在想不出来了。我只想确定是否所有文件都已删除。

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

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

在这种情况下,我认为错误代码不可能有除系统类别之外的任何内容。对于非系统错误类别,将值 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;
}