如何列出存储在SD卡上的所有文件和文件夹

18

我写了一个程序,列出SD卡上所有文件和文件夹(F&F)的位置。如果我触摸列表项中的一个(如果它是一个文件夹),那么该列表会显示在该文件夹中定位的Faf。

以下是源代码

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

}

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 boolean dispatchKeyEvent(KeyEvent event) 
{
    if( KeyEvent.KEYCODE_BACK == event.getKeyCode())
    {
        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 ));


    }

    return true;
}   

}

现在我有两个问题

  1. 当我点击“返回”按钮时,它会回退两步。假设当前列表显示的是“external_sd/Video/Bangla”下的f&f。 按下后退按钮后,列表不再显示“external_sd/Video/”下的f&f,而是显示在“external_sd/”下。

  2. 是否有更好的解决方案来像Java中的JFileChooser一样显示所有的f&f?

6个回答

29
似乎当您触摸返回键时,dispatchKeyEvent()会接收两次KeyEvent KEYCODE_BACK事件,所以我建议您这样做:

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

}

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


    }

@Rabgs:你能否详细说明一下你的代码?我刚刚使用了你的代码,但是出现了应用程序崩溃错误。 - Sumit Sharma
@SumitSharma,抱歉回复晚了,你能解决你的问题吗? - Rick
我想要将列表以网格视图的形式显示,有什么帮助吗? - Krishna Murari

6

要列出外部存储的所有文件和文件夹,最好使用getExternalStorageDirectory()

final String state = Environment.getExternalStorageState();

if ( Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state) ) {  // we can read the External Storage...
    getAllFilesOfDir(Environment.getExternalStorageDirectory());
}

getAllFilesOfDir()是一个递归方法:

private void getAllFilesOfDir(File directory) {
    Log.d(TAG, "Directory: " + directory.getAbsolutePath() + "\n");

    final File[] files = directory.listFiles();

    if ( files != null ) {
        for ( File file : files ) {
            if ( file != null ) {
                if ( file.isDirectory() ) {  // it is a folder...
                    getAllFilesOfDir(file);
                }
                else {  // it is a file...
                    Log.d(TAG, "File: " + file.getAbsolutePath() + "\n");
                }
            }
        }
    }
}

此方法已在API级别29中被弃用。 为了提高用户隐私,直接访问共享/外部存储设备已被弃用。当应用程序的目标为Build.VERSION_CODES.Q时,从此方法返回的路径不再直接可供应用程序访问。应用程序可以通过迁移到替代方案(如Context#getExternalFilesDir(String),MediaStore或Intent#ACTION_OPEN_DOCUMENT)来继续访问存储在共享/外部存储上的内容。 - Michalsx

1

对于txt文件的操作:

    public class TXTList extends Activity {

    ArrayList<File> allTXT = new ArrayList<File>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_item);
        searchTXT(new File(Environment.getExternalStorageDirectory().getPath()));

    }

    private void searchTXT(File dir){
        File[] files = dir.listFiles();
//      Log.i("DIR", "Found " + files.length + " in " + dir.getAbsolutePath());
        for (File file : files) {
            if(file.isFile() && isTXT(file)){
                allTXT.add(file);
                Log.i("TXT", file.getName());
            }else if(file.isDirectory()){
                searchTXT(file.getAbsoluteFile()); 
            }
        }
    }

    private boolean isTXT(File file){
        boolean is = false;
        if(file.getName().endsWith(".txt")){
            is = true;
        }
        return is;
    }

}

1
ArrayList<File> fileList = new ArrayList<File>();
public ArrayList<File> getfile(File dir,String fileType)//pass fileType as a music , video, etc.               
{
    File listFile[] = dir.listFiles();
    if (listFile != null && listFile.length > 0) 
    {
        for (int i = 0; i < listFile.length; i++) 
        {

            if (listFile[i].isDirectory()) 
            {
                getfile(listFile[i],fileType);

            } 
            else 
            {
                if("doc".equals(fileType))
                {
                    if(listFile[i].getName().endsWith(".pdf") || listFile[i].getName().endsWith(".txt") || 
                       listFile[i].getName().endsWith(".xml") || listFile[i].getName().endsWith(".doc") ||
                       listFile[i].getName().endsWith(".xls") || listFile[i].getName().endsWith(".xlsx"))
                     {
                        fileList.add(listFile[i]);  
                     }
                }
                else if("music".equals(fileType))
                {
                    if(listFile[i].getName().endsWith(".mp3"))
                    {
                        fileList.add(listFile[i]);
                    }
                }
                else if("video".equals(fileType))
                {
                    if(listFile[i].getName().endsWith(".mp4"))
                    {
                        fileList.add(listFile[i]);
                    }
                }
                else if("image".equals(fileType))
                {
                    if(listFile[i].getName().endsWith(".png") || listFile[i].getName().endsWith(".jpg")
                       || listFile[i].getName().endsWith(".jpeg") || listFile[i].getName().endsWith(".gif"))
                    {
                        fileList.add(listFile[i]);
                    }
                }
            }
        }
    }
    return fileList;
}

0
import java.io.*;
import java.util.*;
public class DirUtils {

  public static List recurseDir(String dir) {
      String result, _result[];

      result = recurseInDirFrom(dir);
      _result = result.split("\\|");
      return Arrays.asList(_result);
  }

  private static String recurseInDirFrom(String dirItem) {
    File file;
    String  result,list[];

    result = dirItem;

    file = new File(dirItem);
    if (file.isDirectory()) {
      list = file.list();
      File[] fileslist = file.listFiles(new MyDocFileFilter());
    if (fileslist != null) {
      for (File file1: fileslist) {
        System.out.println(file1.getAbsolutePath());
      }
    } 
    else {
      System.out.println("No Subdirectory Found.");
    }
      for (int i = 0; i < list.length; i++)
        result = result + "\n" + recurseInDirFrom(dirItem + File.separatorChar + list[i]);
      }
    return result;
  }

 static class MyDocFileFilter implements FileFilter
{
  private final String[] myDocumentExtensions 
               = new String[] {".java", ".png", ".html", "class"};

  public boolean accept(File file) {

    if (!file.isFile())
        return false;

    for (String extension : myDocumentExtensions) {
      if (file.getName().toLowerCase().endsWith(extension))
        return true;
    }
    return false;
  }
}

  public static void main(String arg[]) {
    DirUtils.recurseDir("your path ");



  }
}

0
一个简单的例子
    File Lis=new File("FolderPatch");
    Lis.listFiles(new FilenameFilter() {

        @Override
        public boolean accept(File dir, String filename) {
            Log.e(">>>>", filename+"<<<");
            return false;
        }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接