我正在尝试在所有 SD 卡中搜索扩展名为“.apk”的文件。我已经写了这个方法。
public void scan(File file) {
mFile = file.listFiles();
if(mFile != null) {
for(int i=0;i<mFile.length;i++) {
if(mFile[i] != null) {
if(mFile[i].isDirectory()) {
scan(mFile[i]);
} else {
if(mFile[i].getName().endsWith(".apk")) {
lista.add(mFile[i].getName());
}
}
}
}
}
}
我作为参数传递
scan(Environment.getExternalStorageDirectory());
问题是,如果我将一些 apk 文件放入 SD 卡,则数组列表大小为 0,并且此方法无法检测到任何 apk 文件。为什么?我的目标是扫描所有 SD 卡以搜索 .apk 文件。
最佳答案
因为 mFile
是一个字段,所以每次调用 scan
都不会获得自己的 mFile
“副本”。
当你调用 scan("/sdcard") 时会发生什么:(我假装参数是文件名而不是 File
,只是为了简化这个解释)
- 已输入 scan("/sdcard")
- scan("/sdcard") 将 mFile 设置为/sdcard 中的文件列表。说 {"/sdcard/folder1", "/sdcard/folder2"}。
- scan("/sdcard") 调用 scan("/sdcard/folder1"),因为它是 mFile 中的第一个元素。
- scan("/sdcard/folder1") 将 mFile 设置为/sdcard/folder1 中的文件列表。说没有。
- scan("/sdcard/folder1") 返回,因为 mFile.length 为 0,k 为 0,并且 0<0 不为 true。
- scan("/sdcard") 返回,因为 mFile.length 为 0,k 为 1,并且 1<0 不为 true。
注意它是如何从未到达/sdcard/folder2 的。
要修复您的代码,您需要做的就是将 mFile
设为 scan
内的局部变量。
关于java - 搜索所有 SD 卡中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27440359/