2010-11-19 60 views
1

我有一些代碼香港專業教育學院在網上找到,並試圖適應經由文件選擇器選擇多個文件夾看的Java獲得多個目錄中的文件夾大小[]

public long getFolderSize(File[] selectedDirectories) { 
long foldersize = 0; 

for(int i = 0; i < selectedDirectories.length; i++){ 
    File[] currentFolder = selectedDirectories[i].listFiles(); 

    for (int q = 0; q < currentFolder.length; q++) { 
    if (currentFolder[q].isDirectory()) { 
    //if folder run self on q'th folder - in which case the files.length will be counted for the files inside 
    foldersize += getFolderSize(currentFolder[q]);//<<the error is here 
    } else { 
    //else get file size 
    foldersize += currentFolder[q].length(); 
    } 
    } 
return foldersize; 
} 

}

的錯誤是:

getFolderSize(currentFolder[q]) 

因爲IM暗示其使用的文件,而不是文件[],但林停留在如何解決它

回答

0

剛剛從陣列更改簽名,以可變參數:

public static long getgFolderSize(final File... selectedDirectories){ 
    long foldersize = 0; 
    for(final File item : selectedDirectories){ 
     for(final File subItem : item.listFiles()){ 
      if(subItem.isDirectory()){ 
       foldersize += getFolderSize(subItem); 
      } else{ 
       foldersize += subItem.length(); 
      } 
     } 
    } 
    return foldersize; 
} 

現在你可以調用該方法或者與一個或多個文件或使用文件的數組。

測試代碼:(更新後可以看到,無論使用可變參數還是不使用可變參數,如果您的主目錄少於5個子文件夾都會失敗)。

public static void main(final String[] args) throws Exception{ 
    final File homeFolder = new File(System.getProperty("user.home")); 
    final File[] subFolders = homeFolder.listFiles(new FileFilter(){ 

     private int ct = 0; 

     @Override 
     public boolean accept(final File pathname){ 
      return pathname.isDirectory() && ct++ < 5; 
     } 
    }); 
    System.out.println("Folders to check:" + Arrays.toString(subFolders)); 
    long accumulated = 0l; 

    for(final File file : subFolders){ 
     accumulated += getFolderSize(file); 
    } 
    final long allAtOnce = getFolderSize(subFolders); 
    final long withVarArgs = 
     getFolderSize(subFolders[0], subFolders[1], subFolders[2], 
      subFolders[3], subFolders[4]); 
    System.out.println("Accumulated: " + accumulated); 
    System.out.println("All at once: " + allAtOnce); 
    System.out.println("With varargs: " + withVarArgs); 
} 

(計算前5個文件夾的大小,在您的家目錄,應在所有平臺上工作,將失敗,並ArrayIndexOutOfBoundException如果在您的家目錄少於五個文件夾)。

輸出我的機器上:

文件夾進行檢查:[/家庭/ seanizer/Ubuntu的一個,/家庭/ seanizer /文檔,/home/seanizer/.java,/家庭/ seanizer/.mozilla,/home/seanizer/.evolution]
累計:1245886955
一次全部:1245886955
可變參數:1245886955

+0

可變varargs不會讓我有一個返回類型,此外不工作 – slex 2010-11-19 14:21:01

+0

它在我的機器上完美運行。嘗試使用我現在添加的主要方法。 – 2010-11-19 14:26:36

+0

可變參數與返回類型無關。 – 2010-11-19 14:27:00

0

您可以創建一個長度爲1的File [],並將File對象添加到它,然後將其傳遞給遞歸調用。這將解決你所看到的錯誤。

File[] tempArray = new File[1]; 
tempArray[0] = currentFolder[q]; 
foldersize += getFolderSize(tempArray); 
+0

我不知道你在說什麼 – slex 2010-11-19 14:20:14

+1

File [] tempArray = new File [1]; tempArray [0] = currentFolder [q]; foldersize + = getFolderSize(tempArray); – DaveJohnston 2010-11-19 14:33:13

+0

戴夫打敗了我。添加到我的解決方案。 – Corv1nus 2010-11-19 15:05:24

0

通常當我寫我的實現方法具我喜歡將它們分成具體的任務。因此,在這種情況下,我會做的是寫方法:

public long getFolderSize(File directory) { 
    long foldersize = 0; 

    File[] currentFolder = directory.listFiles(); 

    for (int q = 0; q < currentFolder.length; q++) { 
     if (currentFolder[q].isDirectory()) { 
      //if folder run self on q'th folder - in which case the files.length will be counted for the files inside 
      foldersize += getFolderSize(currentFolder[q]); 
     } else { 
      //else get file size 
      foldersize += currentFolder[q].length(); 
     } 
    } 
    return foldersize; 
} 

然後我會寫另一種方法來處理目錄的集合:

public long getFolderSize(File[] selectedDirectories) { 
    long foldersize = 0; 

    for(int i = 0; i < selectedDirectories.length; i++){ 
     folderSize += getFolderSize(selectedDirectories[i]); 
    } 
    return foldersize; 
} 

這樣你就可以輕鬆地重新使用方法取決於不同的情況(即單個目錄或集合),而不必創建一個數組,例如只放一個目錄。

或者,您可以保留採​​用File數組並執行遞歸的單一方法如下:

public long getFolderSize(File[] directoryList) { 
    long folderSize = 0; 
    for (int i = 0; i < directoryList.length; i++) { 
     File currentFile = directoryList[i]; 
     if (currentFile.isDirectory()) { 
      folderSize += getFolderSize(currentFile.listFiles()); 
     } else { 
      folderSize += currentFile.length(); 
     } 
    } 
    return folderSize; 
} 
+0

'foldersize + = getFolderSize(currentFolder [q]);' – khachik 2010-11-19 14:45:17

+0

和'fol​​dersize + = currentFolder [q] .length();' – khachik 2010-11-19 14:45:35