如何从目录和子目录中计算大量文件(如root C://或D://)

时间:2014-09-18 04:42:57

标签: java

我正在编写一个代码来计算具有文件夹及其子文件夹特定扩展名的文件。当我从中小型文件夹算起时,这段代码效果很好。

如果从root算起,问题就开始了,例如D://。它会计算一段时间,但会停在中间位置。我认为代码读取大量文件和文件夹效率不高。

public static int countFiles(File directory, String ext) {
    int count = 0;

    for(File file : directory.listFiles()) {
        System.out.println(file);
        if(file.isDirectory()) {
            count += countFiles(file, ext); 
        }
     String textFile = file.toString();
     if(textFile.endsWith(ext)){
         count++;
     }
    }
出现

错误

enter image description here

屏幕截图线错误

enter image description here

2 个答案:

答案 0 :(得分:1)

我认为发生的事情是directory.listFiles()返回null。

尽管文档中未提及,但如果您没有足够的访问权限来列出目录内容,则可能会发生这种情况。你可以很容易地解决这个问题,如下所示。

此外,还有一个轻微的逻辑错误(例如)名为Files ending with .xls的目录也可以被计为文件,当它显然不是时。我也解决了这个问题。

public int countFiles(File directory, String... exts) {
  int count = 0;
  File[] files = directory.listFiles();
  if (files != null) {
    for (File file : files) {
      if (file.isDirectory()) {
        count += countFiles(file, exts);
      } else {
        String textFile = file.toString();
        for (String ext : exts) {
          if (textFile.endsWith(ext)) {
            count++;
          }
        }
      }
    }
  }
  return count;
}

答案 1 :(得分:0)

我只是在countFiles的开头检查空值。

public int countFiles(File directory, String... exts) {
  if (directory == null) return 0;

如果您正在对整个文件系统进行大型递归扫描,那么在调用时间countFiles(file, exts);和调用directory.listFiles()之间不再存在目录是有道理的