2012-01-28 120 views
0

我想獲取目錄的長度(文件大小),我做了下面的遞歸方法來做到這一點,只有當我通過時,我得到了一些非常奇怪的結果new File("C:\\Users\\UserName\\Desktop")作爲參數。在Java中獲取文件夾的大小返回負長

static long totalLength = 0; 

// Method to get the size of a folder and its contents 
private static long getFolderSize(File folder){ 
    if(folder.isDirectory()){ 
     File[] contents = folder.listFiles(); 
     for(File current : contents){ 
      if(current.isDirectory()){ 
       totalLength = totalLength +getFolderSize(current); 
      } 
      totalLength = totalLength + current.length(); 
     } 
    } 
    return totalLength; 
} 

但有趣的是,我的桌面上的一些文件夾做時,我將它們傳遞到方法返回預期的結果。我只是無法解釋爲什麼:我已經對單個文件的長度進行了一些調試,並且它們中沒有一個看起來是負面的,但我仍然有時會得到負面結果!

任何想法,將不勝感激!在此先感謝

+3

你不想周圍的'totalLength = totalLength + current.length()'塊的'else'? – Borealid 2012-01-28 16:48:30

+1

上面的代碼中缺少一些東西,'getFolderSize()'方法接收一個或兩個參數?它是否超載? – 2012-01-28 16:50:03

+0

@ÓscarLópez我不知道你的意思。該方法沒有超載,它只有一個參數。你爲什麼困惑? – Andy 2012-01-28 17:14:53

回答

3

你爲什麼不使用已經有這個內置在已建立的圖書館,如:

這也有測試,以涵蓋這種情況。

+0

回答你的問題,因爲我沒有真正意識到FileUtils庫。我現在正在使用它,它的工作原理,所以感謝一堆! – Andy 2012-01-28 17:25:25

+0

非常好,很高興幫助! – 2012-01-28 17:39:20

+0

icyrock.com,只是一個更多的問題。在計算20 GB文件夾的大小時,這種方法似乎有點慢,所以還有其他選擇,或者我可以採取任何措施來加快速度等。 – Andy 2012-01-28 19:43:45

3

如果聲明您缺少isDirectory()其他{}塊。因此,您在根據文檔指定的目錄上調用File.length()。它可能會返回一個負值。

文檔上File.length()這裏: http://docs.oracle.com/javase/6/docs/api/java/io/File.html#length()

您的代碼也許應該改爲:

if(current.isDirectory()) { 
    totalLength = totalLength +getFolderSize(current, initial); 
    } else { 
    totalLength = totalLength + current.length(); 
    } 
+0

@ruakh - 您編輯了我放入的代碼示例的任何特定原因? – rfeak 2012-01-28 16:57:24

+0

當我開始編輯時,代碼示例並不存在,並且StackOverflow軟件沒有給出任何指示,表明我的編輯與其他編輯衝突。 – ruakh 2012-01-28 17:01:27

+0

@rfeak感謝您的回答,這可能與它有關,但即使添加了其他塊,它仍然無法正常工作。我不認爲它應該有很大的區別,因爲文件夾仍然有一個長度(文件大小),不是嗎?!無論如何,現在並不重要,因爲我知道FileUtils!不過謝謝。 – Andy 2012-01-28 17:23:10

0

我覺得這是更好的文體:

private static long getFolderSize(File f) { 
     if(!f.isDirectory()) return f.length(); 
     long totalLength = 0; 
     for (File current : f.listFiles()) { 
      totalLength += getFolderSize(current); 
     } 
     return totalLength; 
    } 
+0

我看不出有什麼成就。我想要一個目錄的總大小,即右鍵單擊文件夾並按屬性時得到的數字。我不確定你的代碼是幹什麼的,但足以說出我不想要的東西。無論如何,我現在已經找到了解決方案! – Andy 2012-01-28 17:40:57

+0

appologies,我以爲你想要的文件數量 - 但它是一個微不足道的變化。更新了代碼。 – Robert 2012-01-28 19:21:40

+0

感謝代碼Robert,這是一個不錯的變化,但幸運的是我已經發現了FileUtils! – Andy 2012-01-28 19:25:19