解决办法
- 采用广度优先遍历
原因
最早用的深度优先遍历,递归操作。没想到居然有用户 目录套目录,套了 6562 层(你是测试派来的吗。。。。)
更改
private fun traverseFile(rootFile: File) {
var checkFile: File? = rootFile
val queue = ArrayDeque<File?>()
queue.offer(checkFile)
while (!queue.isEmpty()) {
checkFile = queue.poll()
if (checkFile != null) {
val files = checkFile.listFiles()
if (files?.isNotEmpty() == true) {
for (file in files) {
if (file != null) {
if (file.isDirectory) {
queue.offer(file) //是文件夹入queue作为新的需要检索文件夹的路径
} else {
handleFile(file)
}
}
}
}
}
}
}
之前
private fun traverseFile(file: File) {
if (isCancelled) {
Log.i(TAG_DOCUMENT, "Cancel tas, user find file")
} else if (file == null || !file.exists()) {
Log.e(TAG_DOCUMENT, "file is null or not exist")
} else if (file.isDirectory) {
val childList: Array<File>? = file.listFiles()
childList?.forEach {
traverseFile(it)
}
} else {
handleFile(file, result)
}
}
顺便说下,遍历遇到路径乱码的问题
- Android文件路径获取是通过JNI调用
- Android JNI用的字符串,是UTF-8的变更版本,即有部分字符不支持
- 如果文件path有不支持的字符,就会崩溃。
- (当然是测试故意创建的,一般用户,应该不会有这种情况)