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

Web 上のどこかで解決策を見つけたので、それを共有しない理由を自問しました。

        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 に答える
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 ));

}

からすべてのファイルとフォルダーを取得したので、フォルダーに移動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 ));


    }

これが必要だと思います。

于 2013-09-24T04:18:54.137 に答える
0

これを試してみてください:java.ioパッケージは Android 内で再実装されました。Java と同じメカニズムを Android でも使用できます。

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 に答える