2010-07-02 140 views
12

您知道如何在Java中獲取文件夾大小?獲取文件夾大小

長度()File類方法僅適用於文件,使用該方法,我總是得到一個大小爲0

+0

你認爲文件夾「大小」是什麼?文件系統中文件夾的實際大小或其中所有文件的大小? – TofuBeer 2010-07-02 22:39:51

回答

0

文件夾一般有一個非常小的「大小」,你可以把它們作爲指數。

所有返回文件夾「大小」的程序實際上都會迭代並累加文件的大小。

2

迭代文件夾中的所有子文件夾並獲取所有文件的摘要大小。

6
import java.io.File; 

public class GetFolderSize { 

    int totalFolder = 0; 
    int totalFile = 0; 

    public static void main(String args[]) { 
     String folder = "C:/GetExamples"; 
     try { 
      GetFolderSize size = new GetFolderSize(); 
      long fileSizeByte = size.getFileSize(new File(folder)); 
      System.out.println("Folder Size: " + fileSizeByte + " Bytes"); 
      System.out.println("Total Number of Folders: " 
       + size.getTotalFolder()); 
      System.out.println("Total Number of Files: " + size.getTotalFile()); 
     } catch (Exception e) {} 
    } 

    public long getFileSize(File folder) { 
     totalFolder++; 
     System.out.println("Folder: " + folder.getName()); 
     long foldersize = 0; 
     File[] filelist = folder.listFiles(); 
     for (int i = 0; i < filelist.length; i++) { 
      if (filelist[i].isDirectory()) { 
       foldersize += getFileSize(filelist[i]); 
      } else { 
       totalFile++; 
       foldersize += filelist[i].length(); 
      } 
     } 
     return foldersize; 
    } 

    public int getTotalFolder() { 
     return totalFolder; 
    } 

    public int getTotalFile() { 
     return totalFile; 
    } 
} 
27

使用Apache公地-10,有一個FileUtils類與sizeOfDirectory方法

+0

+1不重新發明輪子 – everton 2013-11-11 16:36:32

+0

警告,此方法存在一個嚴重問題,它可能在運行時拋出IllegalArgumentException。請參閱https://issues.apache.org/jira/browse/IO-389 – Fhl 2017-01-13 11:14:48

+0

@Fhl提到的錯誤已從commons-io庫的2.5版中修復。 – X09 2017-01-25 04:38:49

4

沒有與簡單遞歸遍歷所有子文件夾的微小誤差。它有可能在某些文件系統使用符號鏈接創建循環目錄結構如下面所示:

mkdir -- parents father/son 
ln -sf ${PWD}/father father/son 
ls father/son/father/son/father/son/father/son/ 

爲了防止這種錯誤,你可以使用的java.io.File#getCanonicalPath方法。下面的代碼是對previous answer的輕微修改。

public static long getFileSize(File folder) throws IOException { 
    return (getFileSize (folder , new HashSet <String> ())) ; 
} 

public static long getFileSize(File folder, Set<String> history) 
     throws IOException { 
    long foldersize = 0; 
    File[] filelist = folder.listFiles(); 
    for (int i = 0; i < filelist.length; i++) { 
     System.err.println("HISTORY"); 
     System.err.println(history); 
     boolean inHistory = history.contains(filelist[i].getCanonicalPath()); 
     history.add(filelist[i].getCanonicalPath()); 
     if (inHistory) { 
      // skip it 
     } else if (filelist[i].isDirectory()) { 
      foldersize += getFileSize(filelist[i], history); 
     } else { 
      foldersize += filelist[i].length(); 
     } 
    } 
    return foldersize; 
} 
21
import java.io.File; 
import org.apache.commons.io.FileUtils; 

public class FolderSize 
{ 
    public static void main(String[] args) 
    { 
    long size = FileUtils.sizeOfDirectory(new File("C:/Windows/folder")); 

    System.out.println("Folder Size: " + size + " bytes"); 
    } 
} 
+1

+1不重新發明輪子 – everton 2013-11-11 16:35:56

+1

此方法存在嚴重問題。它可以在聚合文件大小時拋出IllegalArgumentException。請參閱https://issues.apache.org/jira/browse/IO-389 – Fhl 2017-01-13 11:08:24

+0

@Fhl提到的錯誤已從commons-io庫的2.5版中修復。 – X09 2017-01-25 04:38:25

0
public class DirectorySize { 
    public static void main(String[] args) { 
      // Prompt the user to enter a directory or a file 
      System.out.print("Please Enter a Directory or a File: "); 
      Scanner input = new Scanner(System.in); 
      String directory = input.nextLine(); 

      // Display the size 
      System.out.println(getSize(new File(directory)) + " bytes"); 
    } 

    public static long getSize(File file) { 
      long size = 0; // Store the total size of all files 

      if (file.isDirectory()) { 
        File[] files = file.listFiles(); // All files and subdirectories 
        for (int i = 0; i < files.length; i++) { 
         size += getSize(files[i]); // Recursive call 
       } 
      } 
      else { // Base case 
        size += file.length(); 
      } 

      return size; 
    } 

}

0

通過文件夾,文件通過文件轉到,獲取每個文件的大小,並將它們添加到可變大小。

static int size=0; 

public static int folderSize(File folder){ 

    size = 0; 

    File[] fileList = folder.listFiles(); 

    for(File file : fileList){ 
     if(!file.isFile()){ 
      folderSize(file); 
     } 
     size += file.length(); 
    } 
    return size; 
}