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