2012-03-02 20 views
43

Hola, estoy buscando la solución para listar todos los archivos desde el dispositivo raíz/Android.Listar todos los archivos de toda la carpeta en una sola lista

supongamos que hay 3 carpetas dentro del directorio raíz, pero quiero mostrar todos los archivos en todos ellos carpeta en una lista única ..

Ahora Si estoy usando

 File f=new File("/sdcard"); 

entonces será una lista de todos los archivos de la carpeta sdcard only..and Si voy a utilizar

 File f=new File("/download"); 

a continuación, aparecerá una lista de todos los archivos de la carpeta de descarga sólo ..y si voy a utilizar

 File f=new File("/"); 

A continuación, aparecerá una lista de archivos direcoty sólo root ... no los archivos dentro de/sdcard/o descarga ..

Entonces, ¿qué pasos debo seguir para listar todos los archivos con un filtro a la lista única Archivos .csv de toda la carpeta dentro de la raíz.

Gracias ..

Respuesta

111

Prueba esto:

..... 
List<File> files = getListFiles(new File("YOUR ROOT")); 
.... 
private List<File> getListFiles(File parentDir) { 
    ArrayList<File> inFiles = new ArrayList<File>(); 
    File[] files = parentDir.listFiles(); 
    for (File file : files) { 
     if (file.isDirectory()) { 
      inFiles.addAll(getListFiles(file)); 
     } else { 
      if(file.getName().endsWith(".csv")){ 
       inFiles.add(file); 
      } 
     } 
    } 
    return inFiles; 
} 

o variante sin recursividad:

private List<File> getListFiles2(File parentDir) { 
    List<File> inFiles = new ArrayList<>(); 
    Queue<File> files = new LinkedList<>(); 
    files.addAll(Arrays.asList(parentDir.listFiles())); 
    while (!files.isEmpty()) { 
     File file = files.remove(); 
     if (file.isDirectory()) { 
      files.addAll(Arrays.asList(file.listFiles())); 
     } else if (file.getName().endsWith(".csv")) { 
      inFiles.add(file); 
     } 
    } 
    return inFiles; 
} 
+0

Oye, muchas gracias :) – Kanika

+1

Hola Vyacheslav Shilkin, tu código funcionó para mí, pero la salida está llegando después de unos pocos segundos (2- 3 segundos). ¿Puedes sugerir algo para hacerlo un poco más rápido? –

+0

Oye, muchas gracias –

1

Puede utilizar siguiente método,

private int readLogList(String filePath) 
{ 
    File directory = Environment.getExternalStorageDirectory(); 

    File folder = new File(directory + ConstantCodes.FILE_SEPARATOR + filePath); 

    if (!folder.exists()) 
    { 
     return 0; 
    } 

    return folder.list().length; 
} 
+1

¿Pero aquí todavía tengo que pasar filePath? No puedo acceder a todos los archivos de todos los directorios – Kanika

+0

, entonces necesita llamar a este método recursivamente – Android

2

He modificado La solución de Vyacheslav porque necesitaba solo nombres de archivos dentro del directorio. Tal vez sea útil para alguien.

... 
List<String> files = getList(new File("YOUR ROOT")); 
... 
private List<String> getList(File parentDir, String pathToParentDir) { 

    ArrayList<String> inFiles = new ArrayList<String>(); 
    String[] fileNames = parentDir.list(); 

    for (String fileName : fileNames) { 
     if (fileName.toLowerCase().endsWith(".txt") || fileName.toLowerCase().endsWith(".rtf") || fileName.toLowerCase().endsWith(".txd")) { 
      inFiles.add(pathToParentDir + fileName); 
     } else { 
      File file = new File(parentDir.getPath() + "/" + fileName); 
      if (file.isDirectory()) { 
       inFiles.addAll(getList(file, pathToParentDir + fileName + "/")); 
      } 
     } 
    } 

    return inFiles; 
} 
+1

Lamento decirlo, pero su modificación no es una mejora. En primer lugar, agrega directorios con el ejemplo .txt y realmente no sé qué pathToParentDir se supone que parentDir.getParent() no puede reparar. Por último, se desaconseja usar "/", use File.separator en su lugar. – Michel

Cuestiones relacionadas