【发布时间】:2016-01-23 16:21:58
【问题描述】:
我正在尝试使用实验性的 <filesystem> 库,它应该成为 C++17 的一部分(参见技术规范草案 N4100)MSVC2015(更新 1)。
我可以设法递归地显示目录的全部内容:
using namespace std::tr2::sys;
...
path dir = canonical(".");
for (auto& p : recursive_directory_iterator(dir)) {
if (is_regular_file(p))
cout << file_size(p);
perms pe = p.status().permissions(); // get authorisations
cout <<"\t"<< (pe & perms::owner_read ? "r" : "-") // <== error should be allowed
<< (pe & perms::owner_write ? "w" : "-");
cout <<"\t" << p << endl;
}
问题和疑问:
perms对象上的按位&:编译器抱怨 C2440 error 缺少从 perms 到 bool 的转换。但这应该根据规范允许。这是一个错误还是我错过了什么?我通过将
pe转换为无符号来解决了这个问题。在那里我注意到,对于每个文件,包括我有意撤回写入授权的文件,该值始终为0xffff。是否会系统地为 Windows 上的权限返回一个恒定的虚拟值,或者我是否忘记了一些东西来获得有效的权限?
【问题讨论】:
-
我不确定权限,但我也注意到文件系统函数无法区分符号链接和常规文件和目录。
-
& 运算符仅在
enum上有效,在enum class上无效。 0xffff 表示 perms::unknown。这还没有实现,在头文件中搜索_Todo变量。文件系统严重偏向于 Unix 敏感性,甚至使用八进制常量,将 Windows 访问权限固定在它上面并不容易。 -
@HansPassant 说得通,谢谢。但是 perms 是一个必须遵守
BitmaskType的枚举类:所以它必须实现&。与此同时,由于@Galik 的已删除答案,我发现我可以将 &-subexpression 转换为 bool,因此问题缩小到转换问题。然而,BitmaskType 定义声明结果应与 0 相当(==0 或 !=0)。不幸的是,这也是不可能的。是我对 BitmaskType 要求太高还是 MS 实现现在太不完整了? -
引用:“或带有额外运算符重载的枚举(作用域和非作用域)”。没有重载。
标签: c++ visual-c++ visual-studio-2015 c++17