我想读取app文件夹的大小。我也可以使用系统应用程序没有问题,但“正常”的应用程序文件夹,它让我遇到问题。我这样做:
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);
我不知道为什么它会诚实地崩溃..没有根需要这个操作。
编辑:
我试过了:
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;
}
但无论如何崩溃
答案 0 :(得分:0)
在File
的循环中,一个(或多个)名为file
的{{1}}个对象为空。解决此问题的最简单方法是通过在循环内添加空检查来忽略null对象:
getFolderSize
答案 1 :(得分:0)
for (File file : dir.listFiles()) {
dir.listFiles()
可以返回null。因此,最好先确定并在使用前检查null
。