2014-01-05 52 views
1

有了這種子目錄:JAVA - 獲取所有子目錄的大小?

C:\test\foo\a.dat (100kb) 
C:\test\foo\b.dat (200kb) 
C:\test\foo\another_dir\jim.dat (500kb) 
C:\test\bar\ball.jpg (5kb) 
C:\test\bar\sam\sam1.jpg (100kb) 
C:\test\bar\sam\sam2.jpg (300kb) 
C:\test\somefile.dat (700kb) 

我想所有子目錄的大小,但只顯示了頂級目錄,運行命令java DU C:\測試應該產生以下輸出:

DIR C:\TEST\FOO 800KB 
FILE C:\TEST\SOMEFILE.DAT 700KB 
DIR C:\TEST\BAR 405KB 

任何幫助將是偉大的,我的代碼到目前爲止是接近,但沒有得到預期的輸出? :/

import java.io.File; 

public class DU { 

public static void main(String[] args) { 

    File file = new File(args[0]); 

    if (file.isDirectory()) { 
     File[] filesNames = file.listFiles(); 
     for (File temp : filesNames) { 
      if (temp.isDirectory()) { 
       File dirs = new File(temp.getPath()); 
       getDirSize(dirs); 
      } else { 
       System.out.println("FILE - " + temp.getPath() + " " 
         + friendlyFileSize(temp.length())); 
      } 
     } 
    } else { 
     System.out.println("THIS IS NOT A FILE LOCATION!"); 
    } 
} 

private static long getDirSize(File dirs) { 
    long size = 0; 
    for (File file : dirs.listFiles()) { 
     if (file.isFile()) 
      size += file.length(); 
     else 
      size += getDirSize(file); 
    } 
    System.out.println("DIR - " + dirs+" "+ friendlyFileSize(size)); 
    return size; 

} 

public static String friendlyFileSize(long size) { 
    String unit = "bytes"; 
    if (size > 1024) { 
     size = size/1024; 
     unit = "kb"; 
    } 
    if (size > 1024) { 
     size = size/1024; 
     unit = "mb"; 
    } 
    if (size > 1024) { 
     size = size/1024; 
     unit = "gb"; 
    } 
    return " (" + size + ")" + unit; 
} 
} 

此代碼獲取所有子目錄而不是顯示一個總所有這些,只打印頂層目錄的輸出???任何幫助許多THX:d

FILE - c:\test\baba.pdf (4)mb 
FILE - c:\test\babdb.txt (67)kb 
DIR - c:\test\one\oneone (67)kb 
DIR - c:\test\one (814)kb 
DIR - c:\test\two\twotwo (322)kb 
DIR - c:\test\two (368)kb 
+0

剛剛從getDirSize移動你的安撫,主要方法 – DKSRathore

回答

2

你recquirement是輸入文件夾,然後顯示該文件夾中的所有文件的大小(包括文件夾)。
我們定義一個文件夾的大小是文件夾中的文件大小(包括子文件夾)的總和。

因此,源代碼的過程如下:
(1)列出文件夾的所有文件作爲輸入。
(2)計算(1)中列表的文件大小。
(3)顯示文件類型(FILE OR DIR),(1)中列出的文件的路徑以及(2)中計算的文件大小。

的源代碼(1)和(3)低於:

public static void showFileSizes(File dir) { 
    File[] files = dir.listFiles(); // (1) 
    long[] fileSizes = new long[files.length]; 
    for(int i = 0; i < files.length; i++) { 
    fileSizes[i] = calculateFileSize(file[i]);//invoke the method corresponding to (2). 
    boolean isDirectory = files[i].isDirectory(); 
    System.out.println(((isDirectory)?"DIR":"FILE") + " - " + files[i].getAbsolutePath() + friendlyFileSize(fileSizes[i]));// as (3) 
    } 
} 

的源代碼(2)下面是:

public static long calculateFileSize(File file) { 
    long fileSize = 0L; 
    if(file.isDirectory()) { 
    File[] children = file.listFiles(); 
    for(File child : children) { 
     fileSize += calculateFileSize(child); 
    } 
    } 
    else { 
    fileSize = file.length(); 
    } 
    return fileSize; 
} 

你有唯一要做的是調用showFileSizes方法。

+0

THX,這正是我需要的,漂亮的,明確的解釋,以及! – macrog

0

保持接近你已經完成的工作,你將不得不在每次遇到它時增加目錄大小。

for (File temp : filesNames) { 
       if (temp.isDirectory()) { 
        dirs = new File(temp.getPath()); 
        heavy += getDirSize(dirs); 
       } else { 
        System.out.println("FILE - " + temp.getPath() + " " 
          + friendlyFileSize(temp.length())); 
       } 
      } 

您也想總結這一切對子目錄

public static void main(String[] args) { 
... 
... 
    System.out.println("DIR - " + dirs.getParent() + " " 
       + friendlyFileSize(heavy)); 
    } 

的父母后顯示的大小此外,您需要檢查目錄中是否有任何文件或沒有,否則dirs.listFiles()將導致NPE

private static long getDirSize(File dirs) { 
     long size = 0; 
     if (dirs != null && dirs.listFiles() != null) { 
      for (File file : dirs.listFiles()) { 
       if (file.isFile()) 
        size += file.length(); 
       else 
        size += getDirSize(file); 
      } 
     } 

     return size; 

    } 

你的整個代碼稍加修改:

public class SubDirs { 
    static long heavy; 

    public static void main(String[] args) { 

     File file = new File("C:\\Program Files"); 
     File dirs = null; 

     if (file.isDirectory()) { 
      File[] filesNames = file.listFiles(); 
      for (File temp : filesNames) { 
       if (temp.isDirectory()) { 
        dirs = new File(temp.getPath()); 
        heavy += getDirSize(dirs); 
       } else { 
        System.out.println("FILE - " + temp.getPath() + " " 
          + friendlyFileSize(temp.length())); 
       } 
      } 
     } else { 
      System.out.println("THIS IS NOT A FILE LOCATION!"); 
     } 

     System.out.println("DIR - " + dirs.getParent() + " " 
       + friendlyFileSize(heavy)); 
    } 

    private static long getDirSize(File dirs) { 
     long size = 0; 
     if (dirs != null && dirs.listFiles() != null) { 
      for (File file : dirs.listFiles()) { 
       if (file.isFile()) 
        size += file.length(); 
       else 
        size += getDirSize(file); 
      } 
     } 

     return size; 

    } 

    public static String friendlyFileSize(long size) { 
     String unit = "bytes"; 
     if (size > 1024) { 
      size = size/1024; 
      unit = "kb"; 
     } 
     if (size > 1024) { 
      size = size/1024; 
      unit = "mb"; 
     } 
     if (size > 1024) { 
      size = size/1024; 
      unit = "gb"; 
     } 
     return " (" + size + ")" + unit; 
    } 
} 
2

通過使用Java 7新的File I/O NIO.2框架,主要通過使用Files.walkFileTree(Path,Set,int,FileVisitor)方法很容易。

import java.io.IOException; 
import java.nio.file.FileVisitOption; 
import java.nio.file.FileVisitResult; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.SimpleFileVisitor; 
import java.nio.file.attribute.BasicFileAttributes; 
import java.util.EnumSet; 
import java.util.concurrent.atomic.AtomicLong; 

public class Main { 

    private static class PrintFiles extends SimpleFileVisitor<Path> { 

     @Override 
     public FileVisitResult visitFile(Path file, BasicFileAttributes attr) { 
      if (attr.isDirectory()) { 
       try { 
        System.out.format("Directory: %s, size: %d bytes\n", file, getDirSize(file)); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } else if (attr.isRegularFile()) { 
       System.out.format("Regular file: %s, size %d bytes\n", file, attr.size()); 
      } 
      return FileVisitResult.CONTINUE; 
     } 

     @Override 
     public FileVisitResult visitFileFailed(Path file, IOException exc) { 
      System.err.println(exc); 
      return FileVisitResult.CONTINUE; 
     } 

     /** 
     * Walks through directory path and sums up all files' sizes. 
     * 
     * @param dirPath Path to directory. 
     * @return Total size of all files included in dirPath. 
     * @throws IOException 
     */ 
     private long getDirSize(Path dirPath) throws IOException { 
      final AtomicLong size = new AtomicLong(0L); 

      Files.walkFileTree(dirPath, new SimpleFileVisitor<Path>() { 
       @Override 
       public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { 
        size.addAndGet(attrs.size()); 
        return FileVisitResult.CONTINUE; 
       } 

       @Override 
       public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { 
        //just skip 
        return FileVisitResult.CONTINUE; 
       } 
      }); 

      return size.get(); 
     } 
    } 

    /** 
    * Main method. 
    * 
    * @param args 
    */ 
    public static void main(String [] args) { 
     Path p = Paths.get("d:\\octopress"); 
     try { 
      Files.walkFileTree(p, EnumSet.noneOf(FileVisitOption.class), 1, new PrintFiles()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
0

通過使用FileUtils.sizeOfDirectory()保持簡短。你必須爲此導入org.apache.commons.io.FileUtils。

 if (temp.isDirectory()) { 
      File dirs = new File(temp.getPath()); 

      System.out.println("DIR - " + dirs+" "+ friendlyFileSize(FileUtils.sizeOfDirectory(dirs))); 

     } 
相關問題