2010-07-02 195 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; 
}