Как перечислить все файлы и папки на SD-карте
Я создал программу, в которой перечислены все файлы и папки (f & f), расположенные на SD-карте. Если я коснусь одного из элементов списка
(если это папка), то в списке отображается 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;
}
}
Теперь у меня есть два вопроса
-
когда я прикасаюсь к кнопке "назад", тогда он перечислит два шага. скажем, в настоящее время список показывает f & f в разделе "external_sd/Video/Bangla".
После нажатия кнопки "Назад" список не отображает f & f под "external_sd/Video/", но в разделе "external_sd/".
-
Есть ли лучшее решение для отображения всех f & f, таких как JFileChooser в java?
Ответы
Ответ 1
Кажется, что когда вы касаетесь Back 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 ));
}
Ответ 2
Чтобы перечислить все файлы и папки внешнего хранилища, лучше использовать 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");
}
}
}
}
}
Ответ 3
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 ");
}
}
Ответ 4
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;
}
Ответ 5
В этом случае для файлов 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);
searchTXTs(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;
}
}
Ответ 6
Простой пример
File Lis=new File("FolderPatch");
Lis.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
Log.e(">>>>", filename+"<<<");
return false;
}
});