在所有SD卡中搜索文件

时间:2014-12-12 09:19:16

标签: java android

我正在尝试使用“.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文件。

4 个答案:

答案 0 :(得分:2)

由于mFile是一个字段,因此对scan的每次调用都没有得到自己的&#34; copy&#34; mFile

当你打电话给扫描时会发生什么(&#34; / sdcard&#34;)是这样的:(我假装参数是文件名而不是File,只是为了简化这个解释)< / p>

  1. 扫描(&#34; / sdcard&#34;)已输入
  2. scan(&#34; / sdcard&#34;)将mFile设置为/ sdcard中的文件列表。说{&#34; / sdcard / folder1&#34;,&#34; / sdcard / folder2&#34;}。
  3. scan(&#34; / sdcard&#34;)调用scan(&#34; / sdcard / folder1&#34;),因为这是mFile中的第一个元素。
  4. scan(&#34; / sdcard / folder1&#34;)将mFile设置为/ sdcard / folder1中的文件列表。说没有。
  5. scan(&#34; / sdcard / folder1&#34;)返回,因为mFile.length为0,k为0,0&lt; 0不为真。
  6. scan(&#34; / sdcard&#34;)返回,因为mFile.length为0,k为1,且1 <0不为真。
  7. 注意它从未到达/ 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();

在您的情况下

文件应该是本地数组