2012-12-20 53 views
0

代碼:如何在java程序中實現目錄deph顯示目錄的大小?

public class DirSize 
{ 
    public static void main(String[] args) 
    { 
     DirSize ds = new DirSize(); 
     System.out.println(ds.getDirSizeInMegabytes(new File("c:/temp"))); 
    } 

    long getDirSize(File dir) 
    { 
     long size = 0; 

     if (dir.isFile()) 
     { 
      size = dir.length(); 
     } 
     else 
     { 
      File[] subFiles = dir.listFiles(); 

      for (File file : subFiles) 
      { 
       if (file.isFile()) 
       { 
        size += file.length(); 
       } 
       else 
       { 
        size += this.getDirSize(file); 
        System.out.println("Directory " + file.getName() 
             + " size = " + size/1021/1024); 
       } 
      } 
     } 
     return size; 
    } 

    long getDirSizeInMegabytes(File dir) 
    { 
     return this.getDirSize(dir)/1024/1024; 
    } 
} 

我想打印尺寸僅爲目錄,在如從最初的2次級別:

c:\temp1\temp2 

但如果有也TEMP3:

c:\temp1\temp2\temp3 its size shouldn't be printed. 

像:

c:\temp1\temp2 size = 10M 
c:\temp1\temp21 size = 15M 
.... 

如何可以做到?謝謝。

回答

1
void getDirSize(File dir,depth) { 
    long size = 0; 

    if (dir.isFile()) { 
     size = dir.length(); 
    } else { 
     depth++; 
     File[] subFiles = dir.listFiles(); 

     for (File file : subFiles) { 
      if (file.isFile()) { 
       size += file.length(); 
      } else { 
       size += this.getDirSize(file,depth); 
       if(depth==1) { 
       System.out.println("Directory " + file.getName() 
         + " size = " + size/1021/1024); 
} 
      } 

     } 
    } 

} 

然後調用

getDirSize(new File("c:/temp"),0) 
2

您需要遞歸深度添加到您的遞歸方法,才能夠限制什麼是印刷:

long getDirSize(File dir, int depth, int printDepth) 

然後,你需要遞歸調用是這樣的:

size += this.getDirSize(file, depth+1, printDepth); 

如果你的意思您只想在maxdepth上打印尺寸,那麼您需要添加如下測試:

if (depth == printDepth) { // or depth <= printDepth maybe 
    // ...do printing only for these 
} 

這可能是有意義的包裝在一個類中的整個事情,這樣你就可以使printDepth一個成員變量,以及遞歸方法私有的,是這樣的:

class DirSizePrinter { 
    int printDepth; 
    File root; 
    public DirSizePrinter(int printDepth, File root) { 
     this.printDepth = printDepth; 
     this.root = root; 
    } 

    public long printSize() { 
     return printSizeRecursive(0); 
    } 

    private long printSizeRecursive(int depth) { 
     // ... code from question with depth added, and using printDepth and root 
    } 
} 

用法:

new DirSizePrinter(3, "C:/temp").printSize(); 

或者根據您的所有要求進行一些變化。