確定Android上(平面,非嵌套)目錄大小的最快,非破解方式是什麼?使用File對象獲取文件列表並通過枚舉來計算大小的速度令人難以忍受 - 肯定有更好的方法嗎?確定Android上SD卡上目錄大小的最快方法
(我知道我可以使用線程計算在後臺的大小,但不會是在這種情況下的理想解決方案)
確定Android上(平面,非嵌套)目錄大小的最快,非破解方式是什麼?使用File對象獲取文件列表並通過枚舉來計算大小的速度令人難以忍受 - 肯定有更好的方法嗎?確定Android上SD卡上目錄大小的最快方法
(我知道我可以使用線程計算在後臺的大小,但不會是在這種情況下的理想解決方案)
我不知道這是否有資格作爲「非黑客「,但如果你不想重新發明輪子,你可以使用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
。
您也可以使用此方法,類似於另一個建議
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
如果遇到錯誤。你可以
如果你獲得目錄'文件'對象的大小會發生什麼?我假設你只會得到FS入門文件大小(可能是4 KB左右),但是誰知道...... – 2011-05-18 06:37:39
目錄的文件大小是未定義的。即使它在一臺設備上給我我想要的東西,但我不能指望所有設備都是如此。 – Melllvar 2011-05-18 11:31:18