2010-07-02 21 views
12

Sai come posso ottenere la dimensione della cartella in Java?Ottieni dimensioni cartella

La lunghezza() metodo nella classe File funziona solo per i file, utilizzando tale metodo che ho sempre ottenere una dimensione di 0.

+0

Cosa ti aspetti che la "dimensione" della cartella sia? La dimensione effettiva della cartella nel file system o la dimensione di tutti i file al suo interno? – TofuBeer

risposta

0

cartelle hanno generalmente una piccola "Size", si può pensare a loro come un indice.

Tutti i programmi che restituiscono una "dimensione" per una cartella effettivamente iterano e sommano le dimensioni dei file.

2

Iterare su tutte le sottocartelle della cartella e ottenere le dimensioni di riepilogo di tutti i file presenti.

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

utilizzare Apache-commons-io, c'è una classe FileUtils con sizeOfDirectory metodi

+0

+1 per non reinventare la ruota – everton

+0

Attenzione, questo metodo ha un problema serio in cui è possibile lanciare un IllegalArgumentException durante l'esecuzione. Vedi https://issues.apache.org/jira/browse/IO-389 – Fhl

+0

Il bug che @Fhl menzionava è stato risolto dalla versione 2.5 della libreria commons-io. – X09

4

C'è un piccolo errore con sufficiente ricorsivamente iterare su tutte le sottocartelle. E 'disponibile in alcuni file system per creare strutture di directory circolare usando i link simbolici come illustrato di seguito:

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

Per evitare questo errore, è possibile utilizzare il metodo java.io.File # getCanonicalPath. Il codice seguente è una leggera modifica di 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 per non reinventare la ruota – everton

+1

Questo metodo ha un problema serio. Può lanciare un IllegalArgumentException mentre aggrega le dimensioni del file. Vedi https://issues.apache.org/jira/browse/IO-389 – Fhl

+0

Il bug che @Fhl menzionava è stato risolto dalla versione 2.5 della libreria commons-io. – X09

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

Passare attraverso una cartella, file per file, ottenendo la dimensione di ogni file e aggiungendo alla dimensione variabile.

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; 
} 
Problemi correlati