2013-04-25 3 views
6

НУЖНО: Я просто пытаюсь получить размер кэша в каждом приложении, установленном в телефоне.Как получить точный размер каталога кеша: android

МОЙ ПОДХОД:

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 всегда. Я проверил кэш моих приложений с помощью процесса:

Настройки: -> Программы: -> ApplicationName

Но я нашел его 0B там.

Почему его случай может кто-то объяснить? и Как получить точный размер кеша?

ответ

9

Длина вызова в каталоге не всегда возвращает правильный размер. Вы можете попробовать выполнить итерацию по списку файлов и добавить все размеры файлов, чтобы получить общий размер каталога.

Как это:

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

где делают я положить/заменить этот код w Ith ?? – MaggotSauceYumYum

0

вы получите CACHESIZE от этой функции

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

Это было более точным мне:

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

Original post of the string to bytes formatting code

+1

Этот ответ более полный и более общий, поэтому его можно использовать в любом месте. –

Смежные вопросы