Android下std::filesystem::directory_iterator不遍历普通文件问题
Cxxdroid中std::filesystem仅遍历目录不枚举文件的原因
1. 安卓分区存储权限限制(核心原因)
安卓10(API 29)及以上启用的**分区存储(Scoped Storage)**是最可能的诱因:
- 公共目录(如
/storage/emulated/0/Downloads)的访问权限被严格管控,Cxxdroid作为普通应用,默认只能访问自身创建的文件,或通过媒体库读取特定类型的媒体文件。 - 目录的权限识别逻辑与普通文件不同,Cxxdroid有权枚举目录结构,但无权限读取目录下的普通文件,因此
std::filesystem::directory_iterator仅返回它能访问的条目——也就是子文件夹。
2. Cxxdroid的std::filesystem实现适配缺陷
Cxxdroid依赖安卓平台的libstdc++/llvm-libc++,部分版本存在适配问题:
- 未正确处理安卓存储的权限映射,导致无法枚举无权限的普通文件。
- 旧版本Cxxdroid的
std::filesystem实现不完整,目录遍历逻辑存在遗漏。
可行的临时解决方案
- 开启存储权限:进入Cxxdroid的系统权限设置,开启「存储」权限;安卓11及以上需额外开启「所有文件访问权限」。
- 切换到私有存储目录:将待处理文件移至Cxxdroid的私有目录(如
/data/data/com.termux.cxxdroid/files),该目录不受分区存储限制,std::filesystem可正常遍历所有文件。 - 结合安卓原生API:若权限申请无效,可通过JNI调用安卓原生文件枚举接口,再配合C++代码完成重命名逻辑。
内容的提问来源于stack exchange,提问作者God I Am Clown
相关产品推荐
相关产品推荐

