使用filesystem迭代器遍历C盘时程序报错退出。
filesystem error: cannot increment recursive directory iterator: Invalid argument
起初以为是什么中文路径或者特殊符号在作妖,排查后发现不是。
之后尝试遍历其它目录全部正常,于是怀疑是C盘权限问题。
询问GPT报错原因,GPT给出的答案是遍历到的文件无法访问或者不存在(说得太对了)
GPT给出的方法是使用std::filesystem::exists(Path),检查目录或文件是否存在
但我寻思着迭代器自己遍历出来的文件怎么可能不存在,它又不会凭空产生一个就很迷惑
之后又经过反复调试输出最后一个遍历到的文件夹是C:\Documents and Settings,这不是用户文件目录吗怎么会出问题?
还有recycle bin之类的几个文件夹都能正常遍历,权限方面怎么会出问题?
然后我又尝试使用std::filesystem::file_status和std::filesystem::perms检查文件及文件夹权限,没问题权限都正常(肯定会返回正常啊)
我设置了skip_permission_denied,所以说“无权访问的文件都被跳过”了(没问题啊)
GPT搞不定我又上网搜索,中文资料数量为0,只有stackoverflow上有着几个零散的提问
提出的问题和我所遇到的一模一样,完全没有一个能用的方案
零零散散看到有提到使用boost库替代stl库就能够解决,那么问题究竟在哪里???
这台电脑上没下载ark工具,后来专门去爱盘下载了一个,看看C:\Documents and Settings到底是什么妖怪?
系统&隐藏,真有意思,我先前一直认为这是用户文件夹,不应该存在权限问题
直接给出解决方案好了,写一大篇胡话
每个文件夹都尝试创建迭代器,成功说明能访问,失败说明不能访问
bool canAccess(const std::filesystem::path &p) {
try {
std::filesystem::directory_iterator{p};
return true;
} catch (const std::filesystem::filesystem_error &e) {
return false;
}
}
std::filesystem::file_status和std::filesystem::perms有BUG
简直坑爹,stackoverflow上都在说已经设置了skip_permission_denied所以不用考虑权限问题
分明是std::filesystem::file_status和std::filesystem::perms有BUG,检查文件及文件夹权限都返回正常所以迭代器不会自动跳过,然后出错
而后我又把所有程序无权访问的文件夹都输出了,艾玛这不都是XP时代遗留的文件夹,为啥现在还不删掉?
有更好的方法欢迎大家讨论,这玩意儿太坑了