如何获取Android缓存目录的确切大小?

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();
    }
}

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

设置:->应用:->ApplicationName

但我发现那里是0B。

为什么会发生这种情况?有人能解释一下吗?我该如何获取精确的缓存大小?

3个回答

19

这对我来说更准确:

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];
}

字符串转换为字节格式的代码原始帖子


1
这个答案更加完整和通用,因此可以在任何地方使用。 - Kevin Ramirez Zavalza

15

调用目录的 length 方法并不总是返回正确的大小。你可以尝试迭代文件列表并累加所有文件大小以获得总目录大小。

像这样:

long size = 0;
File[] files = cacheDirectory.listFiles();
for (File f:files) {
    size = size+f.length();
}

更简单的写法:cacheDir.listFiles()?.sumOf { it.length() } ?: 0 - toffor

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();
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接