¿Cómo leer todos los archivos en una carpeta desde Java?

669

¿Cómo leer todos los archivos en una carpeta a través de Java?

MJ
fuente
8
Estoy de acuerdo, señale la clase que debe usar para que el póster pueda familiarizarse con los diversos métodos; de lo contrario, el póster no se molestará en leer la API para averiguar qué otros métodos están disponibles.
camickr
55
¿Quiso decir todos los archivos en una carpeta, o todos los archivos en una carpeta y todas las subcarpetas?
Jim Garrison el
3
Un enlace actualizado a la API: docs.oracle.com/javase/7/docs/api/java/io/File.html
Tom Duckering
2
Si está utilizando Java 7 o más reciente que puede usar Files.walkFileTree, consulte stackoverflow.com/a/23814217/1115554
micha

Respuestas:

977
public void listFilesForFolder(final File folder) {
    for (final File fileEntry : folder.listFiles()) {
        if (fileEntry.isDirectory()) {
            listFilesForFolder(fileEntry);
        } else {
            System.out.println(fileEntry.getName());
        }
    }
}

final File folder = new File("/home/you/Desktop");
listFilesForFolder(folder);

Files.walk API está disponible en Java 8.

try (Stream<Path> paths = Files.walk(Paths.get("/home/you/Desktop"))) {
    paths
        .filter(Files::isRegularFile)
        .forEach(System.out::println);
} 

El ejemplo utiliza el patrón de prueba con recursos recomendado en la guía API. Asegura que, sin importar las circunstancias, la transmisión se cerrará.

Rico
fuente
10
getName()solo dará el nombre del archivo en su directorio, que podría ser un subdirectorio del original. Si planea utilizar esta información para encontrar los archivos, puede encontrar la ruta dada por getPath()más útil.
Tim Parenti
44
¿Puedo usar este método para encontrar todos los archivos de un tipo específico, por ejemplo, pdf o html, en todo mi sistema? Mi preocupación es la eficiencia, ¿es lo suficientemente rápido como para ser utilizado en sistemas con miles de archivos o hay una mejor alternativa?
Nitin Labhishetty
@codeln A partir de Java 8, el rendimiento es muy aceptable, no se nota nada de retraso. Es lo suficientemente rápido, eficiente y legible para hacer su trabajo.
tom_mai78101
17
En Java 8 también puede hacer uso del filtermétodo. Entonces para cada uno ya no es necesario. Ver aquí -> stackoverflow.com/a/26215931/1029251
Julian Pieles
3
Solo para indicar que solo se inicializa una vez.
rico
176
File folder = new File("/Users/you/folder/");
File[] listOfFiles = folder.listFiles();

for (File file : listOfFiles) {
    if (file.isFile()) {
        System.out.println(file.getName());
    }
}
David Robles
fuente
2
Creo que esto va a imprimir los nombres de directorio, y no hay nombres de archivo
Fortega
1
Con mucho más fácil de entender que la respuesta aceptada. +1.
sam1370
129

En Java 8 puedes hacer esto

Files.walk(Paths.get("/path/to/folder"))
     .filter(Files::isRegularFile)
     .forEach(System.out::println);

que imprimirá todos los archivos en una carpeta mientras excluye todos los directorios. Si necesita una lista, lo siguiente será suficiente:

Files.walk(Paths.get("/path/to/folder"))
     .filter(Files::isRegularFile)
     .collect(Collectors.toList())

Si desea regresar en List<File>lugar de List<Path>simplemente mapearlo:

List<File> filesInFolder = Files.walk(Paths.get("/path/to/folder"))
                                .filter(Files::isRegularFile)
                                .map(Path::toFile)
                                .collect(Collectors.toList());

¡También debes asegurarte de cerrar la transmisión! De lo contrario, podría encontrarse con una excepción que le indica que hay demasiados archivos abiertos. Lea aquí para más información.

Julian Pieles
fuente
3
Obteniendo un error con .map (Path :: toFile) También .forEach (path -> System.out.println (path.toString ()); debe ser .forEach (path -> System.out.println (path.toString ( )));
XaolingBao
2
Dice "Referencia de método no válida, no se puede encontrar el símbolo" ¿Se supone que toFile es otra cosa?
XaolingBao
2
¿Puedes pegar tu código en un PasteBin? Estas usando java.nio.file.Path? Acabo de comprobar que el método toFile () debería existir incluso antes de java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/…
Julian Pieles
2
@NadjibMami Por favor, eche un vistazo aquí: razem.io/blog/posts/year2015/0819_try_catch_lambda Fue compilado para responder en un comentario. Entonces escribí una publicación rápida en el blog.
Julian Pieles
2
Si alguien todavía está buscando el tema try catch lambda, la URL de mi blog ha cambiado -> razem.io/blog/y2015/0819_try_catch_lambda.html
Julian Pieles
26

Todas las respuestas sobre este tema que hacen uso de las nuevas funciones de Java 8 están descuidando cerrar la secuencia. El ejemplo en la respuesta aceptada debería ser:

try (Stream<Path> filePathStream=Files.walk(Paths.get("/home/you/Desktop"))) {
    filePathStream.forEach(filePath -> {
        if (Files.isRegularFile(filePath)) {
            System.out.println(filePath);
        }
    });
}

Del javadoc del Files.walkmétodo:

La secuencia devuelta encapsula uno o más DirectoryStreams. Si se requiere la eliminación oportuna de los recursos del sistema de archivos, la construcción de prueba con recursos se debe utilizar para garantizar que se invoque el método de cierre de la secuencia después de que se completen las operaciones de la secuencia.

Martín
fuente
Nunca debes iterar con Stream. Toma una referencia de Stream, la usa y la elimina.
Rudolf Schmidt
@RudolfSchmidt te refieres a "tirarlo a la basura"?
Roland
1
Quiero decir que la forma correcta es usarlo de esa manera: Files.walk (Paths.get ("/ home / you / Desktop")). Filter (Files :: isRegularFile) .forEach (filePath -> ...)
Rudolf Schmidt
12
import java.io.File;


public class ReadFilesFromFolder {
  public static File folder = new File("C:/Documents and Settings/My Documents/Downloads");
  static String temp = "";

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println("Reading files under the folder "+ folder.getAbsolutePath());
    listFilesForFolder(folder);
  }

  public static void listFilesForFolder(final File folder) {

    for (final File fileEntry : folder.listFiles()) {
      if (fileEntry.isDirectory()) {
        // System.out.println("Reading files under the folder "+folder.getAbsolutePath());
        listFilesForFolder(fileEntry);
      } else {
        if (fileEntry.isFile()) {
          temp = fileEntry.getName();
          if ((temp.substring(temp.lastIndexOf('.') + 1, temp.length()).toLowerCase()).equals("txt"))
            System.out.println("File= " + folder.getAbsolutePath()+ "\\" + fileEntry.getName());
        }

      }
    }
  }
}
muthu krishna
fuente
66
Bienvenido a ! En lugar de solo publicar un bloque de código, explique por qué este código resuelve el problema planteado. Sin una explicación, esto no es una respuesta.
Martijn Pieters
De acuerdo, la simple publicación de un bloque de código no funcionará por favor agregue al menos algunos comentarios en el código ...
Ashraf.Shk786
este es un buen código, puede leer también archivos en subdirectorios de una carpeta.
Mimouni
11
private static final String ROOT_FILE_PATH="/";
File f=new File(ROOT_FILE_PATH);
File[] allSubFiles=f.listFiles();
for (File file : allSubFiles) {
    if(file.isDirectory())
    {
        System.out.println(file.getAbsolutePath()+" is directory");
        //Steps for directory
    }
    else
    {
        System.out.println(file.getAbsolutePath()+" is file");
        //steps for files
    }
}
Sanket Thakkar
fuente
Esta es la solución para que Android lea todos los archivos y carpetas de sdcard o almacenamiento interno.
Sanket Thakkar
10

En Java 7 y superior puedes usar listdir

Path dir = ...;
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
    for (Path file: stream) {
        System.out.println(file.getFileName());
    }
} catch (IOException | DirectoryIteratorException x) {
    // IOException can never be thrown by the iteration.
    // In this snippet, it can only be thrown by newDirectoryStream.
    System.err.println(x);
}

También puede crear un filtro que luego se puede pasar al newDirectoryStreammétodo anterior

DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
    public boolean accept(Path file) throws IOException {
        try {
            return (Files.isRegularFile(path));
        } catch (IOException x) {
            // Failed to determine if it's a file.
            System.err.println(x);
            return false;
        }
    }
};

Para otros ejemplos de filtrado, [ver documentación]. ( Http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob )

Mark Spangler
fuente
Estoy confundido por el ejemplo de crear filtro. Qué es newDirectoryStream.Filter <Path>. ¿Puedes mostrar cómo se declara eso?
simgineer
Creo que lo descubrí. es un error tipográfico de copiar y pegar. hay un espacio entre el "nuevo" y el "DirectoryStream.Filter ...". Si estoy en lo correcto, recomiendo corregir su ejemplo.
simgineer
9

Una observación de acuerdo para obtener todos los archivos en el directorio.
El método Files.walk(path)devolverá todos los archivos recorriendo el árbol de archivos enraizado en el archivo iniciado dado.

Por ejemplo, existe el siguiente árbol de archivos:

\---folder
    |   file1.txt
    |   file2.txt
    |
    \---subfolder
            file3.txt
            file4.txt

Usando el java.nio.file.Files.walk(Path):

Files.walk(Paths.get("folder"))
        .filter(Files::isRegularFile)
        .forEach(System.out::println);

Da el siguiente resultado:

folder\file1.txt
folder\file2.txt
folder\subfolder\file3.txt
folder\subfolder\file4.txt

Para obtener todos los archivos solo en el directorio actual, use java.nio.file.Files.list(Path):

Files.list(Paths.get("folder"))
        .filter(Files::isRegularFile)
        .forEach(System.out::println);

Resultado:

folder\file1.txt
folder\file2.txt
xxxception
fuente
Esta debería ser la única respuesta que queda para la pregunta en este momento en 2020 :)
Haramoz
Votación a favor del Files.listejemplo. Si no desea buscar de forma recursiva, esta puede ser la mejor opción a veces.
Por Lundberg
7

Simplemente recorra todos los archivos usando Files.walkFileTree(Java 7)

Files.walkFileTree(Paths.get(dir), new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        System.out.println("file: " + file);
        return FileVisitResult.CONTINUE;
    }
});
micha
fuente
Tenga en cuenta que este código arrojará una excepción (y no informará más archivos) si para algún archivo o directorio no se pueden leer los atributos del archivo, por ejemplo, debido a los permisos. Fácil de reproducir en `C:`.
Thomas S.
5

Si desea más opciones, puede usar esta función que tiene como objetivo llenar una lista de archivos presentes en una carpeta. Las opciones son: recursivilidad y patrón a juego.

public static ArrayList<File> listFilesForFolder(final File folder,
        final boolean recursivity,
        final String patternFileFilter) {

    // Inputs
    boolean filteredFile = false;

    // Ouput
    final ArrayList<File> output = new ArrayList<File> ();

    // Foreach elements
    for (final File fileEntry : folder.listFiles()) {

        // If this element is a directory, do it recursivly
        if (fileEntry.isDirectory()) {
            if (recursivity) {
                output.addAll(listFilesForFolder(fileEntry, recursivity, patternFileFilter));
            }
        }
        else {
            // If there is no pattern, the file is correct
            if (patternFileFilter.length() == 0) {
                filteredFile = true;
            }
            // Otherwise we need to filter by pattern
            else {
                filteredFile = Pattern.matches(patternFileFilter, fileEntry.getName());
            }

            // If the file has a name which match with the pattern, then add it to the list
            if (filteredFile) {
                output.add(fileEntry);
            }
        }
    }

    return output;
}

Mejor Adrien

Adrien Hadj-Salah
fuente
4
File directory = new File("/user/folder");      
File[] myarray;  
myarray=new File[10];
myarray=directory.listFiles();
for (int j = 0; j < myarray.length; j++)
{
       File path=myarray[j];
       FileReader fr = new FileReader(path);
       BufferedReader br = new BufferedReader(fr);
       String s = "";
       while (br.ready()) {
          s += br.readLine() + "\n";
       }
}
sailakshmi Duggirala
fuente
1
Es posible que desee agregar una explicación de lo que está tratando de lograr, en lugar de mostrar solo el código. Además, myarray=new File[10];no es obligatorio, ya que se sobrescribirá en la siguiente línea.
Veger
3
    static File mainFolder = new File("Folder");
    public static void main(String[] args) {

        lf.getFiles(lf.mainFolder);
    }
    public void getFiles(File f) {
        File files[];
        if (f.isFile()) {
            String name=f.getName();

        } else {
            files = f.listFiles();
            for (int i = 0; i < files.length; i++) {
                getFiles(files[i]);
            }
        }
    }
Santosh Rathod
fuente
3

Creo que esta es una buena manera de leer todos los archivos en una carpeta y subcarpeta

private static void addfiles (File input,ArrayList<File> files)
{
    if(input.isDirectory())
    {
        ArrayList <File> path = new ArrayList<File>(Arrays.asList(input.listFiles()));
        for(int i=0 ; i<path.size();++i)
        {
            if(path.get(i).isDirectory())
            {
                addfiles(path.get(i),files);
            }
            if(path.get(i).isFile())
            {
                files.add(path.get(i));
            }
        }
    }
    if(input.isFile())
    {
        files.add(input);
    }
}
Mohammad
fuente
3

Ejemplo simple que funciona con Java 1.7 para enumerar recursivamente archivos en directorios especificados en la línea de comandos:

import java.io.File;

public class List {
    public static void main(String[] args) {
        for (String f : args) {
            listDir(f);
        }
    }

    private static void listDir(String dir) {
        File f = new File(dir);
        File[] list = f.listFiles();

        if (list == null) {
            return;
        }

        for (File entry : list) {
            System.out.println(entry.getName());
            if (entry.isDirectory()) {
                listDir(entry.getAbsolutePath());
            }
        }
    }
}
pdp
fuente
3

Si bien estoy de acuerdo con Rich, Orian y el resto por usar:

    final File keysFileFolder = new File(<path>); 
    File[] fileslist = keysFileFolder.listFiles();

    if(fileslist != null)
    {
        //Do your thing here...
    }

por alguna razón, todos los ejemplos aquí usan una ruta absoluta (es decir, desde la raíz o, por ejemplo, la letra de la unidad (C: \) para Windows ...)

Me gustaría agregar que también es posible usar la ruta relativa . Entonces, si su pwd (directorio / carpeta actual) es folder1 y desea analizar folder1 / subfolder, simplemente escriba (en el código anterior en lugar de):

    final File keysFileFolder = new File("subfolder");
JamesC
fuente
2
package com;


import java.io.File;

/**
 *
 * @author ?Mukesh
 */
public class ListFiles {

     static File mainFolder = new File("D:\\Movies");

     public static void main(String[] args)
     {
         ListFiles lf = new ListFiles();
         lf.getFiles(lf.mainFolder);

         long fileSize = mainFolder.length();
             System.out.println("mainFolder size in bytes is: " + fileSize);
             System.out.println("File size in KB is : " + (double)fileSize/1024);
             System.out.println("File size in MB is :" + (double)fileSize/(1024*1024));
     }
     public void getFiles(File f){
         File files[];
         if(f.isFile())
             System.out.println(f.getAbsolutePath());
         else{
             files = f.listFiles();
             for (int i = 0; i < files.length; i++) {
                 getFiles(files[i]);
             }
         }
     }
}
Mukesh Jha
fuente
2

Java 8 Files.walk(..)es bueno cuando está adolorido, no arrojará Evite la causa de terminación de Java 8 Files.walk (..) de (java.nio.file.AccessDeniedException) .

Aquí hay una solución segura, aunque no tan elegante como Java 8 Files.walk(..):

int[] count = {0};
try {
    Files.walkFileTree(Paths.get(dir.getPath()), new HashSet<FileVisitOption>(Arrays.asList(FileVisitOption.FOLLOW_LINKS)),
            Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file , BasicFileAttributes attrs) throws IOException {
                    System.out.printf("Visiting file %s\n", file);
                    ++count[0];

                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFileFailed(Path file , IOException e) throws IOException {
                    System.err.printf("Visiting failed for %s\n", file);

                    return FileVisitResult.SKIP_SUBTREE;
                }

                @Override
                public FileVisitResult preVisitDirectory(Path dir , BasicFileAttributes attrs) throws IOException {
                     System.out.printf("About to visit directory %s\n", dir);
                    return FileVisitResult.CONTINUE;
                }
            });
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
GOXR3PLUS
fuente
1
void getFiles(){
        String dirPath = "E:/folder_name";
        File dir = new File(dirPath);
        String[] files = dir.list();
        if (files.length == 0) {
            System.out.println("The directory is empty");
        } else {
            for (String aFile : files) {
                System.out.println(aFile);
            }
        }
    }
Subhojit Das
fuente
1

Solo para ampliar la respuesta aceptada, almaceno los nombres de archivo en una ArrayList (en lugar de simplemente volcarlos en System.out.println) Creé una clase auxiliar "MyFileUtils" para que otros proyectos la puedan importar:

class MyFileUtils {
    public static void loadFilesForFolder(final File folder, List<String> fileList){
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                loadFilesForFolder(fileEntry, fileList);
            } else {
                fileList.add( fileEntry.getParent() + File.separator + fileEntry.getName() );
            }
        }
    }
}

Agregué la ruta completa al nombre del archivo. Lo usarías así:

import MyFileUtils;

List<String> fileList = new ArrayList<String>();
final File folder = new File("/home/you/Desktop");
MyFileUtils.loadFilesForFolder(folder, fileList);

// Dump file list values
for (String fileName : fileList){
    System.out.println(fileName);
}

ArrayList se pasa por "valor", pero el valor se usa para apuntar al mismo objeto ArrayList que vive en el montón JVM. De esta manera, cada llamada de recursión agrega nombres de archivo a la misma ArrayList (NO estamos creando una nueva ArrayList en cada llamada recursiva).

Salvador Valencia
fuente
1

Puede poner la ruta del archivo a argumento y crear una lista con todas las rutas de archivo y no ponerla en la lista manualmente. Luego use un bucle for y un lector. Ejemplo para archivos txt:

public static void main(String[] args) throws IOException{    
File[] files = new File(args[0].replace("\\", "\\\\")).listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".txt"); } });
    ArrayList<String> filedir = new ArrayList<String>();
    String FILE_TEST = null;
    for (i=0; i<files.length; i++){
            filedir.add(files[i].toString());
            CSV_FILE_TEST=filedir.get(i) 

        try(Reader testreader = Files.newBufferedReader(Paths.get(FILE_TEST));
            ){
              //write your stuff
                 }}}
Aris Mist
fuente
1
package com.commandline.folder;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class FolderReadingDemo {
    public static void main(String[] args) {
        String str = args[0];
        final File folder = new File(str);
//      listFilesForFolder(folder);
        listFilesForFolder(str);
    }

    public static void listFilesForFolder(String str) {
        try (Stream<Path> paths = Files.walk(Paths.get(str))) {
            paths.filter(Files::isRegularFile).forEach(System.out::println);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void listFilesForFolder(final File folder) {
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                listFilesForFolder(fileEntry);
            } else {
                System.out.println(fileEntry.getName());
            }
        }
    }

}
Manas Ranjan Mahapatra
fuente
0
import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class AvoidNullExp {

public static void main(String[] args) {

    List<File> fileList =new ArrayList<>();
     final File folder = new File("g:/master");
     new AvoidNullExp().listFilesForFolder(folder, fileList);
}

    public void listFilesForFolder(final File folder,List<File> fileList) {
        File[] filesInFolder = folder.listFiles();
        if (filesInFolder != null) {
            for (final File fileEntry : filesInFolder) {
                if (fileEntry.isDirectory()) {
                    System.out.println("DIR : "+fileEntry.getName());
                listFilesForFolder(fileEntry,fileList);
            } else {
                System.out.println("FILE : "+fileEntry.getName());
                fileList.add(fileEntry);
            }
         }
        }
     }


}
ChetanTwr
fuente
0

enumerar archivos de la carpeta de prueba presente dentro de la ruta de clase

import java.io.File;
import java.io.IOException;

public class Hello {

    public static void main(final String[] args) throws IOException {

        System.out.println("List down all the files present on the server directory");
        File file1 = new File("/prog/FileTest/src/Test");
        File[] files = file1.listFiles();
        if (null != files) {
            for (int fileIntList = 0; fileIntList < files.length; fileIntList++) {
                String ss = files[fileIntList].toString();
                if (null != ss && ss.length() > 0) {
                    System.out.println("File: " + (fileIntList + 1) + " :" + ss.substring(ss.lastIndexOf("\\") + 1, ss.length()));
                }
            }
        }


    }


}
shree
fuente
0
/**
 * Function to read all mp3 files from sdcard and store the details in an
 * ArrayList
 */


public ArrayList<HashMap<String, String>> getPlayList() 
    {
        ArrayList<HashMap<String, String>> songsList=new ArrayList<>();
        File home = new File(MEDIA_PATH);

        if (home.listFiles(new FileExtensionFilter()).length > 0) {
            for (File file : home.listFiles(new FileExtensionFilter())) {
                HashMap<String, String> song = new HashMap<String, String>();
                song.put(
                        "songTitle",
                        file.getName().substring(0,
                                (file.getName().length() - 4)));
                song.put("songPath", file.getPath());

                // Adding each song to SongList
                songsList.add(song);
            }
        }
        // return songs list array
        return songsList;
    }

    /**
     * Class to filter files which have a .mp3 extension
     * */
    class FileExtensionFilter implements FilenameFilter 
    {
        @Override
        public boolean accept(File dir, String name) {
            return (name.endsWith(".mp3") || name.endsWith(".MP3"));
        }
    }

Puede filtrar cualquier archivo de texto o cualquier otra extensión ... simplemente reemplácelo con .MP3

Zar E Ahmer
fuente
0

Hay muchas buenas respuestas arriba, aquí hay un enfoque diferente: en un proyecto maven, todo lo que pones en la carpeta de recursos se copia por defecto en la carpeta de destino / clases. Para ver lo que está disponible en tiempo de ejecución

 ClassLoader contextClassLoader = 
 Thread.currentThread().getContextClassLoader();
    URL resource = contextClassLoader.getResource("");
    File file = new File(resource.toURI());
    File[] files = file.listFiles();
    for (File f : files) {
        System.out.println(f.getName());
    }

Ahora, para obtener los archivos de una carpeta específica, supongamos que tiene una carpeta llamada 'res' en su carpeta de recursos, simplemente reemplace:

URL resource = contextClassLoader.getResource("res");

Si desea tener acceso en su paquete com.companyName, entonces:

contextClassLoader.getResource("com.companyName");
moldavo
fuente
0

Esto leerá los archivos de extensión de archivo especificados en la ruta dada (también se ven las subcarpetas)

public static Map<String,List<File>> getFileNames(String 
dirName,Map<String,List<File>> filesContainer,final String fileExt){
    String dirPath = dirName;
    List<File>files = new ArrayList<>();
    Map<String,List<File>> completeFiles = filesContainer; 
    if(completeFiles == null) {
        completeFiles = new HashMap<>();
    }
    File file = new File(dirName);

    FileFilter fileFilter = new FileFilter() {
        @Override
        public boolean accept(File file) {
            boolean acceptFile = false;
            if(file.isDirectory()) {
                acceptFile = true;
            }else if (file.getName().toLowerCase().endsWith(fileExt))
              {
                acceptFile = true;
              }
            return acceptFile;
        }
    };
    for(File dirfile : file.listFiles(fileFilter)) {
        if(dirfile.isFile() && 
dirfile.getName().toLowerCase().endsWith(fileExt)) {
            files.add(dirfile);
        }else if(dirfile.isDirectory()) {
            if(!files.isEmpty()) {
                completeFiles.put(dirPath, files);  
            }

getFileNames(dirfile.getAbsolutePath(),completeFiles,fileExt);
        }
    }
    if(!files.isEmpty()) {
        completeFiles.put(dirPath, files);  
    }
    return completeFiles;
}
Katta Nagarjuna
fuente
Lo siento si esta es una pregunta novata, pero ¿qué debo pasar como files container?
Pramesh Bajracharya
0

Esto funcionará bien:

private static void addfiles(File inputValVal, ArrayList<File> files)
{
  if(inputVal.isDirectory())
  {
    ArrayList <File> path = new ArrayList<File>(Arrays.asList(inputVal.listFiles()));

    for(int i=0; i<path.size(); ++i)
    {
        if(path.get(i).isDirectory())
        {
            addfiles(path.get(i),files);
        }
        if(path.get(i).isFile())
        {
            files.add(path.get(i));
        }
     }

    /*  Optional : if you need to have the counts of all the folders and files you can create 2 global arrays 
        and store the results of the above 2 if loops inside these arrays */
   }

   if(inputVal.isFile())
   {
     files.add(inputVal);
   }

}
Ashraf.Shk786
fuente
0

Dado un baseDir, enumera todos los archivos y directorios debajo de él, escritos iterativamente.

    public static List<File> listLocalFilesAndDirsAllLevels(File baseDir) {

    List<File>  collectedFilesAndDirs   = new ArrayList<>();
    Deque<File> remainingDirs           = new ArrayDeque<>();

    if(baseDir.exists()) {
        remainingDirs.add(baseDir);

        while(!remainingDirs.isEmpty()) {
            File dir = remainingDirs.removeLast();
            List<File> filesInDir = Arrays.asList(dir.listFiles());
            for(File fileOrDir : filesInDir)  {
                collectedFilesAndDirs.add(fileOrDir);
                if(fileOrDir.isDirectory()) {
                    remainingDirs.add(fileOrDir);
                }
            }
        }
    }

    return collectedFilesAndDirs;
}
WillDev10
fuente
-1

para evitar Nullpointerexceptions en la función listFiles () y obtener recursivamente todos los archivos de subdirectorios también ...

 public void listFilesForFolder(final File folder,List<File> fileList) {
    File[] filesInFolder = folder.listFiles();
    if (filesInFolder != null) {
        for (final File fileEntry : filesInFolder) {
            if (fileEntry.isDirectory()) {
            listFilesForFolder(fileEntry,fileList);
        } else {
            fileList.add(fileEntry);
        }
     }
    }
 }

 List<File> fileList = new List<File>();
 final File folder = new File("/home/you/Desktop");
 listFilesForFolder(folder);
muenchnair
fuente