如何查找Android设备中的所有文件并将其放入列表中?

wooyq4lh  于 2022-12-31  发布在  Android
关注(0)|答案(7)|浏览(179)

我在寻找帮助列出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;
    }
}
kcrjzv8t

kcrjzv8t1#

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());

                }
            }
        }
    }

}
bqjvbblv

bqjvbblv2#

以下是在网上找到的解决方案:

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()放在父目录中,这样它就不会随不同的设备而改变。

lskq00tm

lskq00tm3#

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

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作为源添加到List控件中。

额外好处:如果您希望在树状视图中显示文件列表,我建议您查看https://code.google.com/p/tree-view-list-android/

来源:List all the files from all the folder in a single list
Search all .pdf file present in the Android device

hsgswve4

hsgswve44#

试试这个: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
        }
    }
}
a64a0gku

a64a0gku5#

我用这个代码:

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 * 就可以得到所有名字的列表。

xa9qqrwz

xa9qqrwz6#

我想这会有帮助。首先你需要提取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));
    }

现在您已经将sdcard中的所有文件和文件夹都保存在了listview中,无论何时,只要您进入一个文件夹,就需要获取该文件夹的内容,如下所示:

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));

我想这就是你需要的。

w9apscun

w9apscun7#

前一段时间我写了一个关于这个的教程,现在还在不时地使用这个。看看吧;你可能会找到你需要的东西
playing-with-sdcard-in-android
试试这个:
如果你不想目录被列出,把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);
            }
        }
    }

}

相关问题