2013-04-25 3 views
6

필요 : 단순히 내 휴대 전화에 설치된 각 응용 프로그램의 캐시 크기를 점유하려고합니다.캐시 디렉토리의 정확한 크기를 얻는 방법 : android

MY 접근 방식 :

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을 반환 null의 경우 (조건으로). 그러나 디렉토리가 4Kb를 항상 돌려주는 경우. > 애플리케이션 : - - :

설정 : 나는 과정을 따라 내 응용 프로그램의 캐시를 체크 아웃> ApplicationName을

을하지만 거기에 그 0B를 발견했다.

왜 그런 일이 일어날 수 있습니까? 캐시의 정확한 크기를 얻으려면 어떻게해야합니까?

답변

9

디렉토리의 전화 걸기 길이가 항상 올바른 크기를 반환하지는 않습니다. 파일 목록을 반복하고 전체 파일 크기를 합하여 전체 디렉토리 크기를 가져올 수 있습니다. 이처럼

:

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

내가 할 이 코드 w 넣기/바꾸기 ith ?? – MaggotSauceYumYum

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

에서 CACHESIZE를 얻을 것이다 :

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

이 답변은보다 완전하고보다 일반적인 것이므로 어디에서든 사용할 수 있습니다. –

관련 문제