获取目录及其子目录中文件数量

15

使用这段代码

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

返回特定目录中文件夹和文件的总数,不考虑子目录

我想获取目录及其子目录中所有文件的数量。

附言:如果返回所有文件和文件夹的总和也没有关系。

任何帮助都将不胜感激,谢谢。


1
你可以从这个问题中获取你所需的一切:https://dev59.com/S3I95IYBdhLWcg3w_zas - Robert Kühne
12个回答

37

试试这个。

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

这可能对你有所帮助。


请注意,您可以将 count++ 放在 if/else 之外,因为它无论如何都会增加。然后,就不需要 else 分支了。 - Uooo
无论是否被原帖选择为最佳答案,该解决方案都是不正确的,因为它也计算了目录。原始问题是要计算目录和子目录中的文件数。Mads Hansen提供的解决方案是此处发布的最佳解决方案。 - hfontanez

23

您可以使用递归。

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

22

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

}

这对于Java 8+来说非常好,但是你能解释一下为什么需要collect()吗? - Alexander Smith
collect() 是一个终端操作,一旦被调用,流就会结束,你不能在 collect() 之后调用 parallelStream()。 - Dhruv Rai Puri
根据一些测试和抽样,我发现先收集项目,然后并行处理可以获得小幅度的性能提升。根据文件夹及其内部文件数量的不同,未经编辑的答案可能更优,但已更新为更通用的解决方案。 - Mads Hansen
@MadsHansen 的 fileCount 方法应该返回 long 类型而不是 int。 - Will Humphreys
@WillHumphreys 谢谢,观点很好。我已经更新了从int到long。 - Mads Hansen
@MadsHansen 不会抛出 IOException 吗?在你的示例中似乎没有处理这个异常。 - hfontanez

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

3

您需要递归地遍历所有文件夹并找出其中的文件。

int mCount;

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

3

您需要对文件进行递归搜索。使用`File#isDrirectory()´检查文件是否为目录并向下遍历文件树。


2

仅供参考,您也可以使用迭代代替递归:

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,但你可以使用任何QueueList来完成工作。


2

我之前使用过的一些内容,你可以轻松编辑它以获得你想要的内容:

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

2

这是一个简短的方法,用于返回特定目录中文件和目录的数量:

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

干杯!


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接