递归目录树时计算目录大小

时间:2018-09-17 16:55:06

标签: java file recursion

这是我在这里的第一篇文章,因此,如果我做错任何事情,请告诉我。 另外,这是一项作业。

  

用户选择目录/文件夹,我的程序递归显示所选目录下的所有文件和子目录。该程序还将显示所有文件和子目录的大小。

我已经做了一切。该程序将按预期工作。但是,我使用了apache.commons.io中的FileUtils方法来获取目录的大小,但是显然我不允许这样做。

我不能使用apache.commons.io。

我不能使用Java nio软件包。

我无法创建另一个计算目录大小的方法(单独的方法)。这就是让它变得困难的原因。

我已经有一个递归,它获取所有文件和子目录的名称。我正在考虑向该递归算法中添加一些内容,这将为我提供每个目录下所有文件的总和,但是我只是不知道该怎么做。

有人有可以帮助您的想法吗?

private void recurseDirectory(File f) {

  if (f.isFile()) { 
      show f.getAbsPath() and f.length() on GUI }

  else if (f.isDirectory()) {
      show f.getAbsPath() and FileUtils.sizeOfDirectory(f) on GUI }

      File[] files = f.listFiles();
      for (File file : files) { 
          recurseDirectory(file); }     
}

因此,我不想在代码的那部分中使用FileUtils.sizeOfDirectory(f),而是开始在该目录树下添加所有文件的总和,然后将其返回。

3 个答案:

答案 0 :(得分:0)

您可以使用另一种方法来计算大小,这也是递归的

private void recurseDirectory(File file) {
    System.out.println(file.getAbsolutePath() + " - " + size(file));
    if (file.isDirectory()) {
        File[] files = file.listFiles();
        for (File f : files) {
            recurseDirectory(f);
        }
    }
}

private long size(File file) {
    if(file.isFile()){
        return file.length();
    } else if(file.isDirectory()){
        long size = 0;
        File[] files = file.listFiles();
        for (File f : files) {
            size += size(f);
        }
        return size;
    }
    return 0;
}

答案 1 :(得分:0)

我能够通过在外部类的方法内部创建内部类来实现此目的。在这个内部类的内部,我创建了一个计算目录大小的方法。我知道这并不理想,但这是一项有大量限制的作业。很高兴让它正常工作。

OuterClass-> recursionMethod()-> InnerClass-> getDirSizeMethod()

Class ListDirectory {

   private void recurseDirectory(File f) {

       class InnerClass {

           private long recurseFolder(File f) {
              long folderLength = 0;
              File[] files = f.listFiles();
              for (File file : files) {

                 if (file.isFile()) 
                     { folderLength += file.length(); }

                 else if (f.isDirectory()) 
                     { folderLength += recurseFolder(file); }   
              }
              return folderLength;
          }
      }

    if (f.isFile()) 
        { show f.getAbsolutePath() and f.length() on GUI }

    else if (f.isDirectory()) {

       InnerClass inner = new InnerClass();
       long dirSize = inner.recurseFolder(f);

       show f.getAbsolutePath() and FileUtils.sizeOfDirectory(f) on GUI }

       File[] files = f.listFiles();
       for (File file : files) 
         { recurseDirectory(file); }     
    }
 }

答案 2 :(得分:0)

private long recurseDirectory(File file) {
    if(file.isFile()){
        System.out.println(file.getAbsolutePath() + " - " + file.length());
        return file.length();
    } else if (file.isDirectory()) {
        long size = 0;
        File[] files = file.listFiles();
        for (File f : files) {
            size += recurseDirectory(f);
        }
        System.out.println(file.getAbsolutePath() + " - " + size);
        return size;

    }
    return 0;
}