2011-05-18 54 views
4

確定Android上(平面,非嵌套)目錄大小的最快,非破解方式是什麼?使用File對象獲取文件列表並通過枚舉來計算大小的速度令人難以忍受 - 肯定有更好的方法嗎?確定Android上SD卡上目錄大小的最快方法

(我知道我可以使用線程計算在後臺的大小,但不會是在這種情況下的理想解決方案)

+2

如果你獲得目錄'文件'對象的大小會發生什麼?我假設你只會得到FS入門文件大小(可能是4 KB左右),但是誰知道...... – 2011-05-18 06:37:39

+0

目錄的文件大小是未定義的。即使它在一臺設備上給我我想要的東西,但我不能指望所有設備都是如此。 – Melllvar 2011-05-18 11:31:18

回答

0

我不知道這是否有資格作爲「非黑客「,但如果你不想重新發明輪子,你可以使用Linux命令du。下面是它的manpage剪輯:

NAME 
     du - estimate file space usage 

SYNOPSIS 
     du [OPTION]... [FILE]... 

DESCRIPTION 
     Summarize disk usage of each FILE, recursively for directories. 

特別是參數-c-s應當關心你:

$ du -sc /tmp 
164 /tmp 
164 total 
$ 

它輸出的數量是在目錄中的字節總數。我不知道你是否想要你的字節或可讀格式的大小,但-h是否適合你,如果你也需要。

您必須讀取命令的輸出。捕獲命令輸出已經覆蓋this question,從中我會大量借款提供下面的例子:

public String du(String fileName) { 
    Class<?> execClass = Class.forName("android.os.Exec"); 
    Method createSubprocess = execClass.getMethod("createSubprocess", String.class, String.class, String.class, int[].class); 
    int[] pid = new int[1]; 
    FileDescriptor fd = (FileDescriptor)createSubprocess.invoke(null, "/system/bin/du -sc", fileName, null, pid); 

    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fd))); 
    String output = ""; 
    try { 
     String line; 
     while ((line = reader.readLine()) != null) { 
      output += line + "\n"; 
     } 
    } 
    catch (IOException e) {} 
    return output; 
} 

從那裏,你將需要解析爲代表總規模的數值輸出,我將離開它,因爲它應該是相當平凡的。或者,您可以將其放入du()函數中,並使函數返回int而不是String

0

您也可以使用此方法,類似於另一個建議

public static long getDirSize(File dir) { 
    try { 
     Process du = Runtime.getRuntime().exec("/system/bin/du -sc " + dir.getCanonicalPath(), new String[]{}, Environment.getRootDirectory()); 
     BufferedReader br = new BufferedReader(new InputStreamReader(du.getInputStream())); 
     String[] parts = br.readLine().split("\\s+"); 
     return Long.parseLong(parts[0]); 
    } catch (IOException e) { 
     Log.w(TAG, "Could not find size of directory " + dir.getAbsolutePath(), e); 
    } 
    return -1; 
} 

它以千字節返回的大小,或者-1如果遇到錯誤。你可以