我正在尝试使用“.apk”扩展名搜索所有SD卡中的文件。我写过这个方法。
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文件。
答案 0 :(得分:2)
由于mFile
是一个字段,因此对scan
的每次调用都没有得到自己的&#34; copy&#34; mFile
。
当你打电话给扫描时会发生什么(&#34; / sdcard&#34;)是这样的:(我假装参数是文件名而不是File
,只是为了简化这个解释)< / p>
注意它从未到达/ sdcard / folder2。
要修复您的代码,您需要做的就是在mFile
中将scan
作为局部变量。
答案 1 :(得分:1)
使mFile
成为扫描的局部变量。这是递归工作所必需的。
答案 2 :(得分:0)
您的代码中不需要这一行:
if(mFile[i] != null) {
试试这个:
public void scan(File file) {
mFile = file.listFiles();
if(mFile != null) {
for(int i=0;i<mFile.length;i++) {
if(mFile[i].isDirectory()) {
scan(mFile[i]);
} else {
if(mFile[i].getName().endsWith(".apk")) {
lista.add(mFile[i].getName());
}
}
}
}
}
答案 3 :(得分:-1)
首先传递dir为&#34; / download&#34;存储ur文件的确切位置。 然后传递整个SD卡根路径 像searchAPK(新文件(&#34; / download&#34;));
和代码尝试
private void searchAPK(File dir){
File[] files = dir.listFiles();
Log.i("DIR", "Found " + files.length + " in " + dir.getAbsolutePath());
for (File file : files) {
if(file.isFile() && isAPK(file)){
list.add(file);
Log.i("APK found", file.getName());
}else if(file.isDirectory()){
searchAPK(file.getAbsoluteFile());
}
}
}
private boolean isAPK(File file){
boolean is = false;
if(file.getName().endsWith(".apk") || file.getName().endsWith(".APK")){
is = true;
}
return is;
}
File [] files = dir.listFiles();
在您的情况下文件应该是本地数组