Come leggere tutti i file in una cartella da Java?


669

Come leggere tutti i file in una cartella tramite Java?


8
Sono d'accordo, indica la classe da utilizzare in modo che il poster possa familiarizzare con i vari metodi, altrimenti il ​​poster non si preoccupa di leggere l'API per scoprire quali altri metodi sono disponibili.
Camickr,

5
Intendevi tutti i file in una cartella o tutti i file in una cartella e tutte le sottocartelle?
Jim Garrison,


2
Se si utilizza Java 7 o successiva è possibile utilizzare Files.walkFileTree, vedere stackoverflow.com/a/23814217/1115554
Micha

Risposte:


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);

L' API Files.walk è disponibile da Java 8.

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

L'esempio utilizza il modello di prova con risorse consigliato nella guida API. Assicura che, indipendentemente dalle circostanze, il flusso verrà chiuso.


10
getName()fornirà solo il nome del file nella sua directory, che potrebbe essere una sottodirectory dell'originale. Se si prevede di utilizzare queste informazioni per trovare i file, è possibile che il percorso indicato getPath()sia più utile.
Tim Parenti,

4
Posso usare questo metodo per trovare tutti i file di un tipo specifico, ad esempio pdf o html in tutto il mio sistema? La mia preoccupazione è l'efficienza, è abbastanza veloce per essere utilizzato per sistemi con migliaia di file o esiste un'alternativa migliore?
Nitin Labhishetty,

@codeln A partire da Java 8, le prestazioni sono molto accettabili, non si nota nulla di ritardo. È veloce, efficiente e abbastanza leggibile da portare a termine il tuo lavoro.
tom_mai78101

17
In Java 8 è anche possibile utilizzare il filtermetodo. Quindi per ogni non è più necessario. Vedi qui -> stackoverflow.com/a/26215931/1029251
Julian Pieles,

3
Solo per indicare che è stato inizializzato solo una volta.
ricco il

176
File folder = new File("/Users/you/folder/");
File[] listOfFiles = folder.listFiles();

for (File file : listOfFiles) {
    if (file.isFile()) {
        System.out.println(file.getName());
    }
}

2
Penso che questo stamperà i nomi delle directory e nessun nome di file
Fortega,

1
Di gran lunga più facile da capire della risposta accettata. +1.
sam1370,

129

In Java 8 puoi farlo

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

che stamperà tutti i file in una cartella escludendo tutte le directory. Se hai bisogno di un elenco, farà quanto segue:

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

Se vuoi tornare List<File>invece di List<Path>mapparlo:

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

Devi anche assicurarti di chiudere lo stream! Altrimenti potresti incorrere in un'eccezione che ti dice che sono aperti troppi file. Leggi qui per maggiori informazioni.


3
Ottenere un errore con .map (Path :: toFile) Anche .forEach (path -> System.out.println (path.toString ()); dovrebbe essere .forEach (path -> System.out.println (path.toString ( )));
XaolingBao,

2
Dice "Riferimento metodo non valido, impossibile trovare il simbolo" "Metodo toFile" toFile dovrebbe essere qualcos'altro?
XaolingBao,

2
Puoi per favore incollare il tuo codice in un PasteBin? Stai usando java.nio.file.Path? Ho appena verificato che il metodo toFile () dovrebbe esistere anche prima di java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/…
Julian Pieles

2
@NadjibMami Dai un'occhiata qui: razem.io/blog/posts/year2015/0819_try_catch_lambda È stato compilato per rispondere in un commento. Quindi ho scritto un breve post sul blog.
Julian Pieles,

2
Se qualcuno sta ancora cercando l'argomento prova a catturare lambda, l'URL del mio blog è stato modificato -> razem.io/blog/y2015/0819_try_catch_lambda.html
Julian Pieles

26

Tutte le risposte su questo argomento che fanno uso delle nuove funzioni Java 8 stanno trascurando la chiusura del flusso. L'esempio nella risposta accettata dovrebbe essere:

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

Dal javadoc del Files.walkmetodo:

Il flusso restituito incapsula uno o più stream di directory. Se è necessario lo smaltimento tempestivo delle risorse del file system, è necessario utilizzare il costrutto try-with-resources per garantire che il metodo di chiusura del flusso venga richiamato dopo il completamento delle operazioni del flusso.


Non dovresti mai iterare con Stream. Prendi un riferimento di Stream, lo usi e lo allontani.
Rudolf Schmidt,

@RudolfSchmidt intendi "buttalo via"?
Roland,

1
Intendo il modo corretto è usarlo in quel modo: 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());
        }

      }
    }
  }
}

6
Benvenuto a ! Invece di pubblicare solo un blocco di codice, spiega perché questo codice risolve il problema posto. Senza una spiegazione, questa non è una risposta.
Martijn Pieters

D'accordo, la sola pubblicazione di un blocco di codice non funzionerà, per favore almeno aggiungere alcuni commenti nel codice ...
Ashraf.Shk786

questo è un buon codice, può leggere anche i file nelle sottodirectory di una cartella.
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
    }
}

Questa è la soluzione per Android che legge tutti i file e le cartelle dalla sdcard o dalla memoria interna.
Sanket Thakkar,

10

In Java 7 e versioni successive è possibile utilizzare 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);
}

È inoltre possibile creare un filtro che può quindi essere passato al newDirectoryStreammetodo sopra

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

Per altri esempi di filtro, [vedi documentazione]. ( Http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob )


Sono confuso dall'esempio di creazione del filtro. Cosa è newDirectoryStream.Filter <Path>. Puoi mostrare come viene dichiarato?
ingegnere

Penso di averlo capito. è un errore di copia e incolla. c'è uno spazio tra il "nuovo" e il "DirectoryStream.Filter ...". Se ho ragione consiglio di correggere il tuo esempio.
ingegnere

9

Un'osservazione secondo ottenere tutti i file nella directory.
Il metodoFiles.walk(path) restituirà tutti i file camminando sull'albero dei file radicato sul file avviato specificato.

Ad esempio, c'è il prossimo albero dei file:

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

Utilizzando il java.nio.file.Files.walk(Path):

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

Fornisce il seguente risultato:

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

Per ottenere tutti i file solo nella directory corrente, utilizzare java.nio.file.Files.list(Path):

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

Risultato:

folder\file1.txt
folder\file2.txt

Questa dovrebbe essere l'unica risposta rimasta per la domanda in questo momento nel 2020 :)
Haramoz,

Voto per l' Files.listesempio. Se non vuoi cercare ricorsivamente, questa può essere l'opzione migliore a volte.
Per Lundberg,

7

Basta attraversare tutti i file 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;
    }
});

Si noti che questo codice genererà un'eccezione (e non segnalerà altri file) se per alcuni file o directory non è possibile leggere gli attributi del file, ad esempio a causa delle autorizzazioni. Facile da riprodurre su `C:`.
Thomas S.

5

Se vuoi più opzioni, puoi usare questa funzione che ha lo scopo di popolare un array di file presenti in una cartella. Le opzioni sono: ricorsività e modello da abbinare.

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

Meglio, Adrien


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

1
Potresti voler aggiungere una spiegazione di ciò che stai cercando di ottenere, invece di mostrare solo il codice. Inoltre, myarray=new File[10];non è richiesto, poiché verrà sovrascritto dalla riga successiva!
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]);
            }
        }
    }

3

Penso che questo sia un buon modo per leggere tutti i file in una cartella e sottocartella

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

3

Semplice esempio che funziona con Java 1.7 per elencare ricorsivamente i file nelle directory specificate sulla riga di comando:

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());
            }
        }
    }
}

3

Mentre sono d'accordo con Rich, Orian e il resto per aver usato:

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

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

per qualche ragione tutti gli esempi qui usano un percorso assoluto (cioè completamente dalla radice, o, diciamo, lettera di unità (C: \) per Windows ..)

Vorrei aggiungere che è possibile utilizzare anche il percorso relativo . Quindi, se sei pwd (directory / cartella corrente) è cartella1 e vuoi analizzare cartella1 / sottocartella, scrivi semplicemente (nel codice sopra invece che):

    final File keysFileFolder = new File("subfolder");

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]);
             }
         }
     }
}

2

Java 8 Files.walk(..)va bene quando sei a terra, non genererà la causa di terminazione di evitare Java 8 Files.walk (..) di (java.nio.file.AccessDeniedException) .

Ecco una soluzione sicura, non elegante quanto 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();
}

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

1

Solo per espandere la risposta accettata, memorizzo i nomi dei file in una ArrayList (invece di scaricarli in System.out.println) ho creato una classe di supporto "MyFileUtils" in modo che possa essere importata da altri progetti:

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() );
            }
        }
    }
}

Ho aggiunto il percorso completo al nome del file. Lo useresti così:

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 viene passato per "valore", ma il valore viene utilizzato per puntare allo stesso oggetto ArrayList che si trova nell'heap JVM. In questo modo, ogni chiamata di ricorsione aggiunge nomi di file allo stesso ArrayList (NON stiamo creando un nuovo ArrayList su ogni chiamata ricorsiva).


1

È possibile mettere il percorso del file all'argomento e creare un elenco con tutti i percorsi file e non inserirlo manualmente nell'elenco. Quindi utilizzare un ciclo for e un lettore. Esempio per file 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
                 }}}

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());
            }
        }
    }

}

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


}

0

elencare i file dalla cartella Test presente nel percorso della classe

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()));
                }
            }
        }


    }


}

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"));
        }
    }

È possibile filtrare qualsiasi file di testo o qualsiasi altra estensione. Basta sostituirlo con .MP3


0

Ci sono molte buone risposte sopra, ecco un approccio diverso: in un progetto maven, tutto ciò che metti nella cartella delle risorse viene copiato di default nella cartella target / classes. Per vedere cosa è disponibile in fase di esecuzione

 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());
    }

Ora per ottenere i file da una cartella specifica, supponiamo che tu abbia una cartella chiamata 'res' nella cartella delle risorse, basta sostituire:

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

Se vuoi avere accesso al tuo pacchetto com.companyName, allora:

contextClassLoader.getResource("com.companyName");

0

Questo leggerà i file di estensione di file specificati nel percorso specificato (guarda anche le sottocartelle)

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

Scusate se questa è una domanda noob, ma cosa dovrei passare come files container?
Pramesh Bajracharya

0

Questo funzionerà benissimo:

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

}

0

Dato un baseDir, elenca tutti i file e le directory sottostanti, scritti in modo iterativo.

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

-1

per prevenire Nullpointerexceptions nella funzione listFiles () e ottenere ricorsivamente anche tutti i file dalle sottodirectory ..

 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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.