11

需要:我只是想获取安装在手机中的每个应用程序的占用缓存大小。

我的方法:

PackageManager packageManager = getPackageManager();
List<ApplicationInfo> packages = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);

for (ApplicationInfo packageInfo : packages) 
{
    try 
    {
        Context mContext = createPackageContext(packageInfo.packageName, CONTEXT_IGNORE_SECURITY);
        File cacheDirectory = mContext.getCacheDir();
        if(cacheDirectory==null)
        {
            cacheArrayList.add("0");
        }
        else
        {
            cacheArrayList.add(String.valueOf(cacheDirectory.length()/1024));
        }
    }
    catch (NameNotFoundException e)
    {
        e.printStackTrace();
    }
}

结果:如果目录为空,则返回 0(作为条件)。但是如果目录存在,它总是返回 4 Kb。我按照以下过程检查了我的应用程序的缓存:

设置:-> 应用程序:-> 应用程序名称

但我在那里找到了它的0B。

为什么它会发生有人可以解释?以及如何获得缓存的确切大小?

4

3 回答 3

18

这对我来说更准确:

private void initializeCache() {
    long size = 0;
    size += getDirSize(this.getCacheDir());
    size += getDirSize(this.getExternalCacheDir());
    ((TextView) findViewById(R.id.yourTextView)).setText(readableFileSize(size));
}

public long getDirSize(File dir){
    long size = 0;
    for (File file : dir.listFiles()) {
        if (file != null && file.isDirectory()) {
            size += getDirSize(file);
        } else if (file != null && file.isFile()) {
            size += file.length();
        }
    }
    return size;
}

public static String readableFileSize(long size) {
    if (size <= 0) return "0 Bytes";
    final String[] units = new String[]{"Bytes", "kB", "MB", "GB", "TB"};
    int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
    return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
}

字符串到字节格式代码的原始帖子

于 2016-02-18T17:10:41.647 回答
14

在目录上调用长度并不总是返回正确的大小。您可以尝试遍历文件列表并将所有文件大小相加以获得总目录大小。

像这样:

long size = 0;
File[] files = cacheDirectory.listFiles();
for (File f:files) {
    size = size+f.length();
}
于 2013-04-25T05:20:01.097 回答
0

你将从这个函数中获得缓存大小

  public void clearCache() {
   //clear memory cache

   long size = 0;
   cache.clear();

  //clear SD cache
   File[] files = cacheDir.listFiles();
    for (File f:files) {
      size = size+f.length();
     // f.delete();
  }
}
于 2016-01-13T10:06:26.173 回答