c++ - 如何确定 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
。我只想确定是否所有文件都已删除。
解决方案
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;
}
推荐阅读
- windows - 如何从 Windows 机器上正确删除/卸载证书?只有 .dev 域有问题
- javascript - Angular 6 - 路由未发生 - 垫表行
- c - 这两种 volatile 限定符的用法都是多余的吗?
- log4j - 在 Wildfly 服务器参数中提供 catalina.home 值
- python - 如何使用枚举将文件的特定行读取到python中的变量?
- javascript - 为什么在渲染中返回之前将状态值添加到变量
- xslt - 不同时区中日期时间的 Xslt 转换与夏令时
- python - 如何使用 Tkinter 在屏幕上显示和更新分数?
- javascript - 通过渲染函数更新父组件状态的问题
- reactjs - 使用 if 条件内部映射渲染 React JSX 的问题