Enumere todos los archivos de todas las carpetas en una sola lista

3 minutos de lectura

Avatar de usuario de Kanika
Kanika

Estoy buscando la solución para enumerar todos los archivos desde el dispositivo raíz/Android.

Supongamos que hay tres carpetas dentro del directorio raíz, pero quiero mostrar todos los archivos en todas estas carpetas en una sola lista…

Ahora si estoy usando

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

Luego listará todos los archivos del tarjeta SD solo carpeta… Y si voy a usar

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

Luego enumerará todos los archivos de la carpeta de descarga solamente… y si usaré

File f = new File("/");

Entonces enumerará sólo los raíz archivos de directorio… no los archivos dentro /tarjeta SD o /descargar.

Entonces, ¿qué pasos debo seguir para enumerar todos los archivos con un filtro para enumerar solo los archivos .csv de toda la carpeta interna? raíz?

Avatar de usuario de Vyacheslav Shylkin
Viacheslav Shylkin

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 una 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;
}

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

    – abhishek kumar gupta

    24 de mayo de 2013 a las 7:31


  • Gran respuesta, +1 por publicar una solución que no usa recursividad.

    – el-jengibre-geek

    7 de agosto de 2017 a las 5:15

  • ¿Cuáles son las propiedades de ellos? ¿Presión de memoria potencialmente extrema en uno de los dos? ¿Qué pasa con el rendimiento? Por ejemplo, incluya algunos puntos de referencia (incluida información sobre la plataforma (hardware, versiones de Android, etc.), tipo de tarjeta SD/categoría de rendimiento).

    -Peter Mortensen

    29 de diciembre de 2022 a las 21:47

Avatar de usuario de Micer
Micer

Modifiqué la solución de Vyacheslav porque solo necesitaba nombres de archivo dentro del directorio.

...
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;
}

  • Lamento decirlo, pero su modificación no son mejoras. En primer lugar, agrega directorios con el ejemplo .txt y realmente no sé qué se supone que es pathToParentDir que parentDir.getParent() no puede arreglar. Por último, se desaconseja usar “/”, use File.separator en su lugar.

    – Miguel

    19 de abril de 2014 a las 6:17


Avatar de usuario de Lucifer
Lucifer

Puede utilizar el 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;
}

  • ¿Pero aquí todavía necesito pasar filePath? ¿No puedo acceder a todos los archivos de todos los directorios?

    – Kanika

    2 de marzo de 2012 a las 9:44

  • entonces necesitas llamar a este método recursivamente

    – Lucifer

    2 de marzo de 2012 a las 9:46

¿Ha sido útil esta solución?