解决C++ filesystem 迭代器试图访问高权限文件夹报错问题

使用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时代遗留的文件夹,为啥现在还不删掉?

有更好的方法欢迎大家讨论,这玩意儿太坑了

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇