繁体   English   中英

如何在android设备中查找所有文件并将它们放在列表中?

[英]How to look up for all files in an android device and put them in a list?

我正在寻找帮助以列出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;
    }
}
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());

                }
            }
        }
    }

}

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

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/

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

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

我在网络上的某个地方找到了一个解决方案,我问自己为什么不共享它。

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

您能尝试一下吗: 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
        }
    }
}

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

    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列出所有名字

我认为这会有所帮助。 首先,您需要获取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 ));

}

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

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


    }

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

前不久写了一篇关于这个的教程。 仍会不时使用此功能。 看看,您可能会找到所需的东西。 在Android中玩SD卡

尝试以下操作:如果您不希望列出目录,则将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);
        }
    }
}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM