如何判断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;
}
我正在尝试使用 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;
}