Jak odczytać wszystkie pliki w folderze z Java?


669

Jak odczytać wszystkie pliki w folderze za pośrednictwem Java?


8
Zgadzam się, wskaż klasę, która ma zostać użyta, aby plakat mógł zapoznać się z różnymi metodami, w przeciwnym razie plakat nie będzie próbował czytać interfejsu API, aby dowiedzieć się, jakie inne metody są dostępne.
camickr

5
Czy chodziło Ci o wszystkie pliki w folderze, czy wszystkie pliki w folderze i wszystkie podfoldery?
Jim Garrison,


2
Jeśli używasz Java 7 lub nowszej wersji, której możesz używać Files.walkFileTree, zobacz stackoverflow.com/a/23814217/1115554
micha

Odpowiedzi:


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

Pliki API Files.walk są dostępne w Javie 8.

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

W przykładzie użyto wzorca try-with-resources zalecanego w przewodniku API. Zapewnia to, że bez względu na okoliczności strumień zostanie zamknięty.


10
getName()poda tylko nazwę pliku w swoim katalogu, który może być podkatalogiem oryginału. Jeśli planujesz użyć tych informacji do znalezienia plików, może okazać się, że ścieżka podana przez getPath()jest bardziej przydatna.
Tim Parenti

4
Czy mogę użyć tej metody, aby znaleźć wszystkie pliki określonego typu, np. Pdf lub HTML w całym systemie? Moje obawy dotyczą wydajności, czy jest wystarczająco szybki, aby można go było stosować w systemach z tysiącami plików, czy jest lepsza alternatywa?
Nitin Labhishetty

@codeln Począwszy od Java 8, wydajność jest bardzo do przyjęcia, nie zauważasz w tym nic opóźnionego. Jest szybki, wydajny i wystarczająco czytelny, aby wykonać zadanie.
tom_mai78101

17
W Javie 8 możesz również skorzystać z tej filtermetody. Zatem forEach nie jest już potrzebny. Zobacz tutaj -> stackoverflow.com/a/26215931/1029251
Julian Pieles

3
Żeby wskazać, że został zainicjowany tylko raz.
bogaty

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
Myślę, że to wypisze nazwy katalogów i żadnych nazw plików
Fortega

1
Zdecydowanie łatwiejsze do zrozumienia niż zaakceptowana odpowiedź. +1.
sam1370

129

W Javie 8 możesz to zrobić

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

który wydrukuje wszystkie pliki w folderze, wyłączając jednocześnie wszystkie katalogi. Jeśli potrzebujesz listy, wykonaj następujące czynności:

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

Jeśli chcesz wrócić List<File>zamiast po List<Path>prostu zmapować:

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

Musisz także pamiętać o zamknięciu strumienia! W przeciwnym razie możesz napotkać wyjątek informujący, że otwartych jest zbyt wiele plików. Przeczytaj tutaj, aby uzyskać więcej informacji.


3
Uzyskiwanie błędu z .map (Path :: toFile) Również .forEach (ścieżka -> System.out.println (path.toString ()); powinien być .forEach (ścieżka -> System.out.println (path.toString ( )));
XaolingBao

2
Mówi: „Nieprawidłowe odwołanie do metody, nie można znaleźć symbolu” „Metoda toFile” to toFile ma być czymś innym?
XaolingBao

2
Czy możesz wkleić kod w PasteBin? Używasz java.nio.file.Path? Właśnie sprawdziłem, że metoda toFile () powinna istnieć jeszcze przed java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/…
Julian Pieles

2
@NadjibMami Proszę spojrzeć tutaj: razem.io/blog/posts/year2015/0819_try_catch_lambda Był skompilowany, aby odpowiedzieć w komentarzu. Więc napisałem szybki post na blogu.
Julian Pieles,

2
Jeśli ktoś nadal szuka tematu spróbuj złapać lambda, adres URL mojego bloga został zmieniony -> razem.io/blog/y2015/0819_try_catch_lambda.html
Julian Pieles

26

Wszystkie odpowiedzi na ten temat, które wykorzystują nowe funkcje Java 8, zaniedbują zamknięcie strumienia. Przykład w zaakceptowanej odpowiedzi powinien brzmieć:

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

Z javadoc Files.walkmetody:

Zwrócony strumień zawiera jeden lub więcej DirectoryStreams. Jeśli wymagane jest terminowe usuwanie zasobów systemu plików, należy zastosować konstrukcję try-with-resources, aby upewnić się, że metoda zamknięcia strumienia zostanie wywołana po zakończeniu operacji strumienia.


Nigdy nie powinieneś iterować ze Streamem. Bierzesz odniesienie do strumienia, korzystasz z niego i przenikasz.
Rudolf Schmidt

@RudolfSchmidt masz na myśli „wyrzucić”?
Roland

1
Mam na myśli, że poprawnym sposobem jest użycie go w ten sposób: 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
Witamy w ! Zamiast pisać tylko blok kodu, wyjaśnij, dlaczego ten kod rozwiązuje postawiony problem. Bez wyjaśnienia nie jest to odpowiedź.
Martijn Pieters

Zgadzam się, tylko opublikowanie bloku kodu nie będzie działać, proszę przynajmniej dodać kilka komentarzy w kodzie ...
Ashraf.Shk786

jest to tak dobry kod, że może odczytywać również pliki z podkatalogów folderu.
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
    }
}

To rozwiązanie dla Androida odczytuje wszystkie pliki i foldery z sdcard lub pamięci wewnętrznej.
Sanket Thakkar

10

W Javie 7 i nowszych możesz użyć 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);
}

Możesz także utworzyć filtr, który można następnie przekazać do newDirectoryStreampowyższej metody

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

W celu uzyskania innych przykładów filtrowania [patrz dokumentacja]. ( Http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob )


Jestem zdezorientowany przykładem tworzenia filtra. Co to jest newDirectoryStream.Filter <Ścieżka>. Czy możesz pokazać, jak to jest zadeklarowane?
simgineer,

Myślę, że to rozgryzłem. jego kopia i wklej literówkę. pomiędzy „nowym” a „DirectoryStream.Filter ...” jest spacja. Jeśli mam rację, zalecam poprawienie twojego przykładu.
simgineer,

9

Jedna uwaga zgodnie z wszystkimi plikami w katalogu.
Metoda Files.walk(path)zwróci wszystkie pliki, przechodząc do drzewa plików zakorzenionego w podanym uruchomionym pliku.

Na przykład istnieje następne drzewo plików:

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

Korzystanie z java.nio.file.Files.walk(Path):

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

Daje następujący wynik:

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

Aby uzyskać wszystkie pliki tylko w bieżącym katalogu, użyj java.nio.file.Files.list(Path):

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

Wynik:

folder\file1.txt
folder\file2.txt

To powinna być jedyna odpowiedź na pytanie teraz w 2020 roku :)
Haramoz

Głosuj za Files.listprzykładem. Jeśli nie chcesz wyszukiwać rekurencyjnie, czasami może to być najlepsza opcja.
Per Lundberg,

7

Po prostu przejdź przez wszystkie pliki za pomocą 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;
    }
});

Zauważ, że ten kod zgłosi wyjątek (i nie zgłasza dalszych plików), jeśli dla niektórych plików lub katalogów atrybuty plików nie mogły zostać odczytane, np. Z powodu uprawnień. Łatwe do odtworzenia na `C:`.
Thomas S.,

5

Jeśli chcesz uzyskać więcej opcji, możesz użyć tej funkcji, która ma na celu zapełnienie listy plików znajdujących się w folderze. Dostępne opcje: rekurencyjność i wzór do dopasowania.

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

Pozdrawiam, 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
Możesz dodać wyjaśnienie, co próbujesz osiągnąć, zamiast pokazywać tylko kod. Co więcej, myarray=new File[10];nie jest wymagane, ponieważ zostanie zastąpione przez następny wiersz!
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

Myślę, że to dobry sposób na odczyt wszystkich plików w folderze i podfolderze

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

Prosty przykład, który współpracuje z Javą 1.7 w celu rekurencyjnego wyświetlania plików w katalogach określonych w wierszu poleceń:

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

Chociaż zgadzam się z Richiem, Orianem i resztą za użycie:

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

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

z jakiegoś powodu wszystkie przykłady tutaj wykorzystują ścieżkę bezwzględną (tj. całą drogę od roota lub, powiedzmy, literę dysku (C: \) dla Windows ..)

Chciałbym dodać, że można również użyć ścieżki względnej . Więc jeśli jesteś pwd (bieżący katalog / folder) to folder1 i chcesz przeanalizować folder1 / podfolder, po prostu napisz (w powyższym kodzie zamiast):

    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(..)jest dobra, gdy jesteś w trakcie gry, nie wyrzuci przyczyny przerwania Java 8 Files.walk (..) (wyjątek java.nio.file.AccessDeniedException) .

Oto bezpieczne rozwiązanie, choć nie tak eleganckie jak 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

Aby rozwinąć zaakceptowaną odpowiedź, przechowuję nazwy plików w ArrayList (zamiast po prostu zrzucić je do System.out.println) utworzyłem klasę pomocniczą „MyFileUtils”, aby mogła zostać zaimportowana przez inne projekty:

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

Dodałem pełną ścieżkę do nazwy pliku. Użyłbyś tego w ten sposób:

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 jest przekazywany przez „wartość”, ale wartość jest używana do wskazywania tego samego obiektu ArrayList, który mieszka w stercie JVM. W ten sposób każde wywołanie rekurencyjne dodaje nazwy plików do tej samej ArrayList (NIE tworzymy nowej ArrayList dla każdego wywołania rekurencyjnego).


1

Możesz podać ścieżkę pliku do argumentu i utworzyć listę ze wszystkimi ścieżkami do plików, a nie umieszczać jej ręcznie. Następnie użyj pętli for i czytnika. Przykład dla plików 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

wyświetl listę plików z folderu Test znajdujących się wewnątrz ścieżki klasy

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

Możesz filtrować dowolne pliki tekstowe lub inne rozszerzenia. Po prostu zamień je na .MP3


0

Istnieje wiele dobrych odpowiedzi powyżej, oto inne podejście: w projekcie maven wszystko, co umieścisz w folderze zasobów, jest domyślnie kopiowane do folderu docelowego / klas. Aby zobaczyć, co jest dostępne w czasie wykonywania

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

Teraz, aby pobrać pliki z określonego folderu, powiedzmy, że masz folder o nazwie „res” w folderze zasobów, po prostu zastąp:

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

Jeśli chcesz mieć dostęp do pakietu com.companyName:

contextClassLoader.getResource("com.companyName");

0

Spowoduje to odczytanie określonych plików rozszerzeń plików w danej ścieżce (wygląda również na podfoldery)

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

Przepraszam, jeśli to pytanie noob, ale co powinienem przekazać jako files container?
Pramesh Bajracharya

0

To zadziała dobrze:

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

Biorąc pod uwagę baseDir, wymienia wszystkie pliki i katalogi poniżej, zapisane iteracyjnie.

    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

aby zapobiec wyjątkom Nullpointerexcept dla funkcji listFiles () i rekurencyjnie pobrać wszystkie pliki z podkatalogów ..

 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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.