получить количество файлов в каталоге и его подкаталогах

используя этот код

new File("/mnt/sdcard/folder").listFiles().length

возвращает сумму папок и файлов в определенном каталоге, не заботясь о поддиректории. Я хочу получить количество всех файлов в каталоге и его подкаталогах.

С. П. : вряд ли имеет значение, если он возвращает сумму всех файлов и папок.

любая помощь ценится, спасибо

12 ответов


попробуйте это.

int count = 0;
getFile("/mnt/sdcard/folder/");

private void getFile(String dirPath) {
    File f = new File(dirPath);
    File[] files = f.listFiles();

    if (files != null)
    for (int i = 0; i < files.length; i++) {
        count++;
        File file = files[i];

        if (file.isDirectory()) {   
             getFile(file.getAbsolutePath()); 
        }
    }
}

Это может помочь вам.


вы можете использовать рекурсию.

public static int getFilesCount(File file) {
  File[] files = file.listFiles();
  int count = 0;
  for (File f : files)
    if (f.isDirectory())
      count += getFilesCount(f);
    else
      count++;

  return count;
}

использование Java 8 NIO:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Test {

  public long fileCount(Path dir) { 
    return Files.walk(dir)
                .parallel()
                .filter(p -> !p.toFile().isDirectory())
                .count();
  }

  public void main(String... args) {
    Path dir = Paths.get(args[0]);
    long count = fileCount(dir);

    System.out.println(args[0] + " has " + count + " files");
  }

}

public Integer countFiles(File folder, Integer count) {
    File[] files = folder.listFiles();
    for (File file: files) {
        if (file.isFile()) {
            count++;
        } else {
            countFiles(file, count);
        }
    }

    return count;
}

использование:

Integer count = countFiles(new File("your/path"), Integer.valuOf(0));

вам придется выполнить рекурсивный поиск по вашим файлам. Используйте ' File#isDrirectory (), чтобы проверить, является ли файл каталогом и пересечь дерево файлов вниз.


вы должны пойти, хотя все папки рекурсивно и узнайте файлы

int mCount;

getTotalFiles(File dir) {
    File[] files = dir.listFiles();
    for (File file : files) {
        if (file.isDirectory()) {
            getTotalFiles(file);
        } else {
            mCount++;
        }
    }
}

то, что я использовал раньше, вы можете легко отредактировать его, чтобы получить то, что хотите:

public class Filewalker {

    public void walk( String path ) {

        File root = new File( path );
        File[] list = root.listFiles();

        for ( File f : list ) {
            if ( f.isDirectory() ) {
                walk( f.getAbsolutePath() );
                System.out.println( "Dir:" + f.getAbsoluteFile() );
            }
            else {
                System.out.println( "File:" + f.getAbsoluteFile() );
            }
        }
    }

    public static void main(String[] args) {
        Filewalker fw = new Filewalker();
        fw.walk("c:\" );
    }
}

вот короткий, инкапсулированный в одном методе, просто возвращающий количество файлов и каталогов в определенном каталоге:

public static int countFiles(File directory) {
    int count = 0;
    for (File file : directory.listFiles()) {
        if (file.isDirectory()) {
            count += countFiles(file); 
        }
        count++;
    }
    return count;
}

Ура!


только для записи вы также можете использовать итерацию вместо рекурсии:

public static int countFiles(final File dir) {
    final ArrayDeque<File> dirs = new ArrayDeque<>();
    dirs.add(dir);
    int cnt = 0;
    while (!dirs.isEmpty()) {
        final File[] files = dirs.poll().listFiles();
        for (final File f: files)
            if (f.isDirectory())
                dirs.add(f);
            else
                ++cnt;
    }
    return cnt;
}

в этой реализации я использую ArrayDeque но вы можете использовать любые очереди и список для работы.


public int numberOfFiles(File srcDir) {
    int count = 0;
    File[] listFiles = srcDir.listFiles();
    for(int i = 0; i < listFiles.length; i++){
        if (listFiles[i].isDirectory()) {
            count += numberOfFiles(listFiles[i]);
        } else if (listFiles[i].isFile()) {
            count++;
        }
    }
    return count;
}

http://www.java2s.com/Code/Java/File-Input-Output/Countfilesinadirectoryincludingfilesinallsubdirectories.htm

public static int countFilesInDirectory(File directory) {
  int count = 0;
  for (File file : directory.listFiles()) {
      if (file.isFile()) {
          count++;
      }
      if (file.isDirectory()) {
          count += countFilesInDirectory(file);
      }
  }
  return count;
}

обратитесь к этому сайту

это дает прекрасный ответ


import java.io.File;
import java.util.Scanner;

public class Test {

    public static void main(String[] args) {


     Scanner sc=new Scanner(System.in);  

     System.out.println("Enter the Path for Directory/Folder Name");  
     String Directory=sc.nextLine(); 
     System.out.println("Your Directory/folder is :"+Directory);

     File f = new File(Directory);

     int countFiles = 0;
     int countDirectory=0;
     for (File file : f.listFiles()) {
             if (file.isFile()) {
                     countFiles++;
             }
             if (file.isDirectory()) {
                     countDirectory++;
             }

     }
     System.out.println("Number of files in Directory : " + countFiles+"\nNumber of Sub-directories "+countDirectory);

    }

}