Lista todos los archivos de toda la carpeta en una sola lista


Hola, estoy buscando la solución para enumerar todos los archivos del dispositivo root/Android.

Supongamos que hay 3 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");

Entonces enumerará todos los archivos de la carpeta sdcard solamente..y si voy a utilizar

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

Entonces enumerará todos los archivos de la carpeta de descarga solamente ..y si voy a utilizar

       File f=new File("/");

Entonces listará solo root direcoty archivos...no los archivos dentro de / sdcard o / download..

Entonces, qué pasos debo seguir para listar todos los archivos con un filtro para listar solo .archivos csv de toda la carpeta dentro de root.

Gracias..

Author: Kanika, 2012-03-02

3 answers

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 recursión:

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;
}
 122
Author: Vyacheslav Shylkin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-17 14:32:48

He modificado la solución de Vyacheslav porque solo necesitaba nombres de archivo 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;
}
 2
Author: Micer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-08 13:27:14

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;
}
 1
Author: Lucifer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-02 09:39:30