天天看點

(一一七)基本檔案操作 -SDWebImage清除緩存 -檔案夾的大小計算

在iOS的App沙盒中,Documents和Library/Preferences都會被備份到iCloud,是以隻适合放置一些記錄檔案,例如plist、資料庫檔案。緩存一般放置到Library/Caches,tmp檔案夾會被系統随機清除,不适宜防止資料。

【圖檔緩存的清除】

在使用SDWebImage時,圖檔被大量的緩存,有時需要擷取緩存的大小以及清除緩存。

要擷取緩存大小,使用SDImageCache單例的getSize方法拿到byte為機關的緩存大小,注意計算時按1K=1000計算。

拿到M為機關的檔案大小的方法,如下:

double size = [[SDImageCache sharedImageCache] getSize] / 1000.0 / 1000.0;
           

要清除緩存,調用clearDisk方法,分為有回調和無回調。

因為清除緩存的時間可能會比較長,是以應該用訓示器予以訓示。

[[SDImageCache sharedImageCache] clearDiskOnCompletion:^{
       
    // 清除完畢的處理。
        
}];
           

【檔案夾大小計算】

使用NSFileManager可以拿到檔案的屬性,如果檔案是目錄,拿到的FileSize是沒有意義的,因為目錄的大小需要遞歸計算,不宜作為一個靜态屬性。是以隻有檔案的FileSize屬性才是檔案的大小。

為了計算檔案夾的大小,應該遞歸内部所有檔案,還好蘋果官方內建了遞歸方法,通過遞歸可以拿到所有的目錄和所有的檔案,隻要利用FileManager的方法判斷是否是檔案,如果是檔案則拿到FileSize屬性累加,就能計算出檔案夾的大小,如下:

需要注意的是周遊出來的檔案是以Caches為根目錄的,是以擷取屬性時應該拼接出全路徑。

- (void)fileSize{

    NSFileManager *manager = [NSFileManager defaultManager];
    
    NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    
    NSArray *files = [manager subpathsOfDirectoryAtPath:cachePath error:nil]; // 遞歸所有子路徑
    
    NSInteger totalSize = 0;
    
    for (NSString *filePath in files) {
        NSString *path = [cachePath stringByAppendingPathComponent:filePath];
        // 判斷是否為檔案
        BOOL isDir = NO;
        [manager fileExistsAtPath:path isDirectory:&isDir];
        if (!isDir) {
            NSDictionary *attrs = [manager attributesOfItemAtPath:path error:nil];
            totalSize += [attrs[NSFileSize] integerValue];
        }
    }
    
    NSLog(@"%d",totalSize);
    
}