Java'daki bir klasördeki tüm dosyalar nasıl okunur?


669

Java ile bir klasördeki tüm dosyalar nasıl okunur?


8
Kabul ediyorum, posterin çeşitli yönteme aşina olabilmesi için kullanılacak sınıfı gösterin, aksi takdirde poster hangi diğer yöntemlerin mevcut olduğunu bulmak için API'yi okumak için uğraşmaz.
camickr

5
Bir klasördeki tüm dosyalar mı yoksa bir klasördeki tüm dosyalar ve tüm alt klasörler mi demek istediniz?
Jim Garrison


2
Java 7 veya daha Files.walkFileTree
yenisini

Yanıtlar:


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'sı Java 8'den edinilebilir.

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

Örnekte, API kılavuzunda önerilen kaynaklarla deneme kalıbı kullanılmıştır. Koşul ne olursa olsun akışın kapatılmasını sağlar.


10
getName()yalnızca dizindeki, orijinalin alt dizini olabilecek dosyanın adını verecektir. Dosyaları bulmak için bu bilgileri kullanmayı planlıyorsanız, verilen yolu getPath()daha kullanışlı bulabilirsiniz.
Tim Parenti

4
Tüm sistemim boyunca pdf veya html gibi belirli bir türdeki tüm dosyaları bulmak için bu yöntemi kullanabilir miyim? Endişem verimlilik, binlerce dosyaya sahip sistemler için kullanılacak kadar hızlı mı yoksa daha iyi bir alternatif var mı?
Nitin Labhishetty

@codeln Java 8'den itibaren performans çok kabul edilebilir, bununla ilgili hiçbir şey fark etmiyorsunuz. Hızlı, verimli ve işinizi yapacak kadar okunabilir.
tom_mai78101

17
Java 8'de filteryöntemi de kullanabilirsiniz . O zaman forEach artık gerekli değildir. Buraya bakın -> stackoverflow.com/a/26215931/1029251
Julian Pieles

3
Sadece bir kez başlatıldığını belirtmek için.
zengin

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
Bence bu dizin adlarını yazdıracak ve dosya isimleri
yazmayacak

1
Anlamak kabul edilen cevaptan çok daha kolay. +1.
sam1370

129

Java 8'de bunu yapabilirsiniz

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

tüm dizinler hariç tutulurken bir klasördeki tüm dosyalar yazdırılır. Bir listeye ihtiyacınız varsa, aşağıdakiler yapılacaktır:

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

Eşlemek List<File>yerine geri dönmek istiyorsanız List<Path>:

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

Akışı kapattığınızdan da emin olmalısınız! Aksi takdirde, çok fazla dosyanın açık olduğunu bildiren bir istisna ile karşılaşabilirsiniz. Daha fazla bilgi için burayı okuyun .


3
.Map (Path :: toFile) ile hata alma Ayrıca .forEach (path -> System.out.println (path.toString ()); .forEach (path -> System.out.println (path.toString ( )));
XaolingBao

2
"Geçersiz yöntem başvurusu, bulamıyor sembolü" yazıyor "toFile yöntemi" toFile başka bir şey olması gerekiyordu?
XaolingBao

2
Kodunuzu bir PasteBin'e yapıştırabilir misiniz? Kullanıyor musunuz java.nio.file.Path? Java (- docs.oracle.com/javase/7/docs/api/java/nio/file/…
Julian Pieles

2
@NadjibMami Lütfen buraya bir göz atın: razem.io/blog/posts/year2015/0819_try_catch_lambda Bir yorumda cevap vermek üzere derlenecekti . Bu yüzden hızlı bir blog yazısı yazdım.
Julian Pieles

2
Hala denemek yakalamak lambda konu arayan varsa blogumun url değiştirildi -> razem.io/blog/y2015/0819_try_catch_lambda.html
Julian Pieles

26

Bu konudaki yeni Java 8 işlevlerinden yararlanan tüm yanıtlar akışı kapatmayı ihmal ediyor. Kabul edilen cevaptaki örnek şöyle olmalıdır:

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

Files.walkYöntemin javadocundan :

Döndürülen akış bir veya daha fazla DirectoryStream'i içeriyor. Dosya sistemi kaynaklarının zamanında atılması gerekiyorsa, akış işlemleri tamamlandıktan sonra akışın kapatma yönteminin çağrıldığından emin olmak için kaynaklarla deneme yapısı kullanılmalıdır.


Stream ile asla yineleme yapmamalısınız. Bir Akış referansı alırsınız, kullanırsınız ve aktarırsınız.
Rudolf Schmidt

@RudolfSchmidt "fırlat" mı demek istiyorsun?
Roland

1
Demek istediğim doğru yol bu şekilde kullanmaktır: Files.walk (Paths.get ("/ home / you / Desktop")). Filter (Dosyalar :: 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
Hoşgeldiniz ! Lütfen yalnızca bir kod bloğu göndermek yerine, bu kodun neden ortaya çıkan sorunu çözdüğünü açıklayın . Bir açıklama olmadan, bu bir cevap değildir.
Martijn Pieters

Kabul etti, Sadece bir kod bloğu göndermek işe yaramazsa lütfen en azından koda bazı yorumlar ekleyin ...
Ashraf.Shk786

bu iyi bir kod, bir klasörün alt dizinlerindeki dosyaları da okuyabilir.
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
    }
}

Bu android için sdcard veya dahili depolama tüm dosya ve klasörleri okumak için bir çözümdür.
Sanket Thakkar

10

Java 7 ve sonraki sürümlerde listdir komutunu kullanabilirsiniz

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

Ayrıca, newDirectoryStreamyukarıdaki yönteme geçirilebilen bir filtre de oluşturabilirsiniz.

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

Diğer filtreleme örnekleri için [belgelere bakın]. ( Http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob )


Filtre örneği oluşturma konusunda kafam karıştı. NewDirectoryStream.Filter <Yol> nedir. Bunun nasıl beyan edildiğini gösterebilir misiniz?
simgineer

Bence anladım. Bu bir kopyala ve yapıştır yazım hatası. "new" ile "DirectoryStream.Filter ..." arasında bir boşluk vardır. Eğer haklıysam, örneğin düzeltilmesini tavsiye ederim.
simgineer

9

Dizindeki tüm dosyaları almak için bir açıklama.
Yöntem Files.walk(path), belirtilen başlangıç ​​dosyasında bulunan dosya ağacını yürüterek tüm dosyaları döndürür.

Örneğin, bir sonraki dosya ağacı vardır:

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

Kullanarak java.nio.file.Files.walk(Path):

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

Aşağıdaki sonucu verir:

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

Yalnızca geçerli dizindeki tüm dosyaları almak için şunu kullanın java.nio.file.Files.list(Path):

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

Sonuç:

folder\file1.txt
folder\file2.txt

Bu, şu anda 2020'de soru için kalan tek cevap olmalı :)
Haramoz

Örnek için oy verin Files.list. Eğer varsa yok yinelemeli aramak istediğiniz, bu bazen en iyi seçenek olabilir.
Per Lundberg

7

Tüm dosyaları Files.walkFileTree(Java 7) kullanarak gezinin

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

Not, bu kod bir istisna (ve olacağı değil , bazı dosya veya dizin dosya öznitelikleri için çünkü izinleri örneğin okunamadı eğer başka rapor dosyaları). `C: 'de çoğaltılması kolaydır.
Thomas S.

5

Daha fazla seçenek istiyorsanız, bir klasörde bulunan bir dosya dizisini doldurmayı amaçlayan bu işlevi kullanabilirsiniz. Seçenekler şunlardır: özyineleme ve eşleşecek desen.

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

En iyi 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
Yalnızca kodu göstermek yerine, elde etmeye çalıştığınız şeye bir açıklama eklemek isteyebilirsiniz. Ayrıca, bir myarray=new File[10];sonraki satırın üzerine yazılacağı için gerekli değildir!
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

Bence bu bir klasör ve alt klasördeki tüm dosyaları okumak için iyi bir yoldur

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

Komut satırında belirtilen dizinlerdeki dosyaları özyinelemeli olarak listelemek için Java 1.7 ile çalışan basit bir örnek:

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

Ben Zengin, Orian ve kullanmak için geri kalanı ile kabul ederken:

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

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

bazı nedenlerden dolayı buradaki tüm örnekler mutlak yol kullanır (yani kökten tüm yol veya Windows için sürücü harfini (C: \).)

Göreceli yolu da kullanmanın mümkün olduğunu eklemek isterim . Yani, pwd (geçerli dizin / klasör) klasör1 ise ve klasör1 / alt klasörü ayrıştırmak istiyorsanız, sadece (yerine yukarıdaki kodda) yazmanız yeterlidir:

    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(..)çok iyiyse o kadar iyi atmaz .

Java 8 kadar zarif olmasa da güvenli bir çözüm 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

Sadece kabul edilen cevabı genişletmek için dosya adlarını bir ArrayList'e saklıyorum (sadece System.out.println'e dökmek yerine) diğer projeler tarafından içe aktarılabilecek bir yardımcı sınıf "MyFileUtils" oluşturdum:

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

Dosya adına tam yolu ekledim. Bunu şöyle kullanırsınız:

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, "value" tarafından iletilir, ancak değer, JVM Yığında yaşayan aynı ArrayList nesnesini işaret etmek için kullanılır. Bu şekilde, her özyineleme çağrısı aynı ArrayList'e dosya adları ekler (her özyinelemeli çağrıda yeni bir ArrayList oluşturmuyoruz).


1

Dosya yolunu bağımsız değişkene koyabilir ve tüm dosya yollarını içeren bir liste oluşturabilir ve listeyi elle koyamazsınız. Sonra bir for döngüsü ve bir okuyucu kullanın. Txt dosyaları için örnek:

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

sınıf yolunda bulunan Test klasöründeki dosyaları listele

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

Herhangi bir metin dosyasına veya başka bir uzantıya filtre uygulayabilirsiniz. Sadece .MP3 ile değiştirin


0

Yukarıda birçok iyi yanıt var, işte farklı bir yaklaşım var: Bir maven projesinde, kaynaklar klasörüne koyduğunuz her şey varsayılan olarak hedef / sınıflar klasörüne kopyalanır. Çalışma zamanında nelerin mevcut olduğunu görmek için

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

Şimdi dosyaları belirli bir klasörden almak için, kaynak klasörünüzde 'res' adlı bir klasörünüz olduğunu varsayalım, değiştirin:

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

Com.companyName paketinizde erişmek istiyorsanız, o zaman:

contextClassLoader.getResource("com.companyName");

0

Bu, belirtilen yolda belirtilen dosya uzantısı dosyalarını okuyacaktır (alt klasörlere de bakar)

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

Bu bir çaylak soru varsa üzgünüm ama ne olarak geçmeliyim files container?
Pramesh Bajracharya

0

Bu iyi çalışır:

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

Bir baseDir verildiğinde, altındaki tüm dosyaları ve dizinleri tekrar tekrar yazarak listeler.

    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

listFiles () işlevinde Nullpointerexceptions önlemek ve tüm dosyaları alt dizinlerden de özyinelemeli almak için ..

 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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.