2

我寻求帮助来列出 android 外部存储设备中的所有文件。我想在所有文件夹中查找,包括主文件夹的子文件夹。有什么办法吗?

我已经做了一个基本的,但仍然没有得到想要的结果。它不起作用。这是我的代码:

File[] files_array;
files_array = new File(Environment.getExternalStorageDirectory().getAbsolutePath()).listFiles();

请帮忙。谢谢你。

编辑:

此方法返回 0 大小。我不知道怎么回事。这是我的活动:

public class Main extends ListActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        List<File> files = getListFiles(Environment.getExternalStorageDirectory());
        setListAdapter(new ArrayAdapter<File>(Main.this, android.R.layout.simple_list_item_1, files));
        Toast.makeText(this, "" + files.size(), Toast.LENGTH_LONG).show();
    }

    private List<File> getListFiles(File parentDir) {
        // On first call, parentDir is your sdcard root path
        ArrayList<File> inFiles = new ArrayList<File>(); // initialize an array list to store file names
        File[] files = parentDir.listFiles(); // list all files in this directory
        for (File file : files) {
            if (file.isDirectory()) { // if the file is a directory
                inFiles.addAll(getListFiles(file)); // **CALL THIS RECURSIVELY TO GET ALL LOWER LEVEL FILES**
            } 

        }
        return inFiles;
    }
}
4

7 回答 7

4
public void Search_Dir(File dir) {
    String pdfPattern = ".pdf";

    Log.d("check",
            "Environment.getExternalStorageDirectory()------"
                    + dir.getName());

    File FileList[] = dir.listFiles();
    Log.d("check",
            "filelist length---- "
                    + FileList.length);

    if (FileList != null) {
        for (int i = 0; i < FileList.length; i++) {

            if (FileList[i].isDirectory()) {
                Search_Dir(FileList[i]);
            } else {

                Log.d("check",
                        "for check from .pdf---- "
                                + FileList[i].getName());
                if (FileList[i].getName().endsWith(pdfPattern)) {
                    // here you have that file.
                    pdfArrayList.add(FileList[i].getPath());

                }
            }
        }
    }

}
于 2016-05-11T06:20:02.813 回答
3

我在网上某处找到了解决方案,我问自己为什么不分享它。

        public void walkdir(File dir) {

        File[] listFile;
        listFile = dir.listFiles();

        if (listFile != null) {
            for (int i = 0; i < listFile.length; i++) {
                if (listFile[i].isDirectory()) {
                    walkdir(listFile[i]);
                } else {
                  if (listFile[i].getName().toLowerCase().endsWith(".pdf")){
                      files_list.add(listFile[i]);
                  }
                }
            }
        }    
    }

您实际上需要的只是使用您要开始的父目录调用上面的方法。我建议将 Environment.getExternalStorageDirectory() 放在父目录中,这样它就不会随着不同的设备而改变。

于 2013-09-25T07:31:02.390 回答
2

从概念上讲,您正在做的事情并不完整。您的代码只为您提供根级目录的文件。要确定此目录和子目录中的所有文件,您需要递归调用,以便将所有文件列出到文件夹级别的末尾。

private List<File> getListFiles(File parentDir) {
    // On first call, parentDir is your sdcard root path
    ArrayList<File> inFiles = new ArrayList<File>(); // initialize an array list to store file names
    File[] files = parentDir.listFiles(); // list all files in this directory
    for (File file : files) {
        if (file.isDirectory()) { // if the file is a directory
            inFiles.addAll(getListFiles(file)); // **CALL THIS RECURSIVELY TO GET ALL LOWER LEVEL FILES**
        } 

    }
    return inFiles;
}

现在将此函数称为:

getListFiles(Environment.getExternalStorageDirectory());

现在,您可以将 ArrayList 作为源添加到列表控件。

奖励:如果您想在树状视图中表示文件列表,我建议您查看https://code.google.com/p/tree-view-list-android/

来源: 在一个列表中列出所有文件夹中的所有文件

搜索 Android 设备中存在的所有 .pdf 文件

于 2013-09-24T04:25:45.020 回答
0

我使用了这段代码,希望对您有所帮助:

    private File[] listOfDir;

    ...

    TextView tv = (TextView) rootView.findViewById(R.id.textView1);
    listOfDir = show();
    String temp = "";
    if (listOfDir != null) {
        for (File i : listOfDir) {
            temp += i.getName() + '\n';
        }
    } else {
        temp = "null";
    }
    tv.setText(temp);
    ...

  public File[] show() {
    File[] dirs = null;
    File dir = new File(*your path*);
    dirs = dir.listFiles();
    return dirs;
}

只需调用 show 即可列出所有名称

于 2013-09-24T04:14:10.293 回答
0

你能试试这个吗:这个java.io包已经在 Android 中重新实现了。您可以在 Android 中使用与在 Java 中相同的机制。

File fileList = new File("/sdcard"); // path which you want to read
if (fileList != null){
    File[] files = fileList.listFiles();
        for (File f : files){
            //Do something with the files
        }
    }
}
于 2013-09-24T04:11:42.447 回答
0

我认为这会有所帮助。首先,您需要获取 sd 卡的内容,如下所示:

public class FileList extends ListActivity 
{
private File file;
private List<String> myList;

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    myList = new ArrayList<String>();   

    String root_sd = Environment.getExternalStorageDirectory().toString();
    file = new File( root_sd + "/external_sd" ) ;       
    File list[] = file.listFiles();

    for( int i=0; i< list.length; i++)
    {
            myList.add( list[i].getName() );
    }

    setListAdapter(new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, myList ));

}

现在您已经拥有了 中的所有文件和文件夹,每当sdcardlistview进入一个文件夹时,您都需要获取该文件夹的内容,如下所示:

protected void onListItemClick(ListView l, View v, int position, long id) 
{
    super.onListItemClick(l, v, position, id);

    File temp_file = new File( file, myList.get( position ) );  

    if( !temp_file.isFile())        
    {
        file = new File( file, myList.get( position ));
        File list[] = file.listFiles();

        myList.clear();

        for( int i=0; i< list.length; i++)
        {
            myList.add( list[i].getName() );
        }
        Toast.makeText(getApplicationContext(), file.toString(), Toast.LENGTH_LONG).show(); 
        setListAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, myList ));

    }

}

再次按下后,您需要加载上一个文件夹的内容,如下所示:

@Override
public void onBackPressed() {
            String parent = file.getParent().toString();
            file = new File( parent ) ;         
            File list[] = file.listFiles();

            myList.clear();

            for( int i=0; i< list.length; i++)
            {
                myList.add( list[i].getName() );
            }
            Toast.makeText(getApplicationContext(), parent,          Toast.LENGTH_LONG).show(); 
            setListAdapter(new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, myList ));


    }

我认为这就是你所需要的。

于 2013-09-24T04:18:54.137 回答
0

前段时间写了一篇关于这个的教程。仍然不时使用它。看看,你可能会找到你需要的。 玩 sdcard-in-android

试试这个:如果你不想列出目录 put files.add(file1[i]); 在 else 块中的行

public class MainActivity extends ListActivity {
ArrayList<File> files = new ArrayList<File>();
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    File file[] = Environment.getExternalStorageDirectory().listFiles();
    recursiveFileFind(file);

    setListAdapter(new ArrayAdapter<File>(MainActivity.this,
            android.R.layout.simple_list_item_1, files));
    Toast.makeText(this, "" + files.size(), Toast.LENGTH_LONG).show();
}

public void recursiveFileFind(File[] file1) {
    int i = 0;
    String filePath = "";
    if (file1 != null) {
        while (i != file1.length) {
            filePath = file1[i].getAbsolutePath();
            files.add(file1[i]);
            if (file1[i].isDirectory()) {
                File file[] = file1[i].listFiles();
                recursiveFileFind(file);
            }else{
                            }

            i++;
            Log.d(i + "", filePath);
        }
    }
}

}

于 2013-09-24T05:06:34.917 回答