我想读取应用程序文件夹的大小。我也可以用系统应用程序做这件事,没有问题,但"正常"的应用程序文件夹会给我带来问题。我是这样做的:
File apk = new File("/data/app");
if (apk.exists()){
float apksize=getFolderSize(apk)/(1024f*1024f);
apk.setText(Html.fromHtml(getResources().getString(R.string.apk)+ " " +"<b>" +String.format("%.2f", apksize)+ " " + "Mb" + "</b>"
));
} else {
apk.setText(devicefragment.this.getResources().getString(R.string.folderapknotfound));
}
然后是文件夹大小的方法
public static long getFolderSize(File dir) {
long size = 0;
for (File file : dir.listFiles()) {
if (file.isFile()) {
// System.out.println(file.getName() + " " + file.length());
size += file.length();
} else
size += getFolderSize(file);
}
return size;
}
对于其他所有文件夹,我都尝试过,效果很好。。这个没有。logcat返回:
FATAL EXCEPTION: main
java.lang.NullPointerException
at com.myapp.deviceinfo.getFolderSize(devicefragment.java:316)
at com.myapp.deviceinfo.onCreateView(devicefragment.java:179)
...
其中线316是:size += getFolderSize(file);
,线179是:float apksize=getFolderSize(apk)/(1024f*1024f);
老实说,我不知道它为什么会崩溃。。此操作不需要root用户。
编辑:
我试过了:
public static long getFolderSize(File dir) {
long size = 0;
for (File file : dir.listFiles()) {
if (file == null) {
continue;
}
if (file.isFile()) {
// System.out.println(file.getName() + " " + file.length());
size += file.length();
} else
size += getFolderSize(file);
}
return size;
}
但是还是崩溃了
在getFolderSize
的循环中,一个(或多个(名为file
的File
对象为null。解决这个问题的最简单方法是通过在循环中添加null检查来忽略null对象:
for (File file : dir.listFiles()) {
if(file == null) {
continue;
}
...
}
for (File file : dir.listFiles()) {
dir.listFiles()
可以返回null。因此,最好先确定并在使用前检查null
。