3

是否可以在不遍历所有文件的情况下获取文件夹(以及所有子 * 文件夹)中的文件总数,并递归地深入?

我的意思是这确实很容易,但也许有更好的解决方案?

private int totalFileCounter = 0;

private void countFiles(File f) {
    if (f.isDirectory()) {
        for (File fi : f.listFiles()) {
            countFiles(fi);
        }
    } else {
        totalFileCounter++;
    }
}

编辑:好吧,也许我的问题没有问得那么好......我的意思是java或文件系统或其他东西有什么功能可以让我获得O(1)中的文件总数?如果所有解决方案现在都有运行时间 O(n)。

4

3 回答 3

1

通常,最简单的解决方案是最好的。我不会使用字段来计算应该是函数的结果。如果一次从两个线程调用该方法,您可能会得到不正确的结果。

static int countFiles(File f) {
    if (f.isDirectory()) {
        int sum = 0;
        for (File fi : f.listFiles()) 
            sum += countFiles(fi);
        return sum;
    }
    return 1;
}
于 2012-09-19T10:45:23.027 回答
0

是的,使用 aQueue进行迭代广度优先搜索。这是一个示例(未经测试):

private void countFiles(File f) {
    Queue<File> queue = new LinkedList<File>();
    queue.add(f);
    while (!queue.isEmpty()) {
      File file = queue.poll();
      if (file.isDirectory()) {
        queue.addAll(Arrays.asList(file.listFiles()));
      } else {
        totalFileCounter++;
      }
    }
}
于 2012-09-19T10:43:43.407 回答
0

这个Apache Commons API可以满足您的目的吗?它返回Collection<File>

于 2012-09-19T10:50:11.977 回答