項目中碰到一個需要計算沙盒目錄的大小的功能。
看了下NSFileManager提供的方法,找到一個
- (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error NS_AVAILABLE(10_5, 2_0);
發現這個問題,解決方法只有一種方法了,就是遞歸便利目錄累加所有的文件;
本來氣勢沖沖的寫了一半了,突然發現
- (NSArray *)subpathsAtPath:(NSString *)path;
哎喲我勒個去,這樣就不要寫遞歸了,直接拼接上相對路徑,直接就能夠拿到你想要的絕對路徑了!!
這樣計算一個目錄的大小就只用寫一個while就可以了
+(NSString*)getCacheSize
{
NSDate* begin = [NSDate date];
NSFileManager* fm = [NSFileManager defaultManager];
__block NSError* error = nil;
__block NSUInteger fileSize = 0;
//獲取Books的緩存
dispatch_sync(queue, ^{
NSArray* subFiles = [fm subpathsAtPath:BOOKHEADERPath([LoginPlugin share].userID)];
NSLog(@"subpath = %@",subFiles);
for (NSString* fileName in subFiles) {
if ([fileName hasSuffix:@"png"]||[fileName hasSuffix:@"jpg"]) {
NSDictionary* dic = [fm attributesOfItemAtPath:BOOKPATH([LoginPlugin share].userID,fileName) error:&error];
NSUInteger size = (error ? 0:[dic fileSize]);
fileSize += size;
}
}
});
NSString* cacheString = [NSString stringWithFormat:@"%.1fM",fileSize/(1024.0*1024)];
NSTimeInterval time = [begin timeIntervalSinceNow];
NSLog(@"便利文件耗費時間:%lf",time/60.0);
return cacheString;
}
在我的項目還有另一個問題,我要統計緩存,因為我用了SDWebImage,所以要整合我自己下載的圖書還有SDImageCache;
查看了下SDImageCache的代碼,其中提供了一個方法:
- (void)calculateSizeWithCompletionBlock:(SDWebImageCalculateSizeBlock)completionBlock;
但是如果碰到我上邊寫的代碼有個返回值的,就有問題了。
因為我不可能在Block裡邊return size;
這個如何是好,著實讓人歡喜讓人憂
哈哈,這個時候解決辦法就是獲取SDImageCache的queue,然後在它執行完自己的計算task之後,同步調用阻塞主線程,這樣就可以不需要修改代碼了
為毛這樣可以捏?因為這個queue是串行的,哇哈哈!!!
方法如下:
+(NSString*)getCacheSize
{
NSDate* begin = [NSDate date];
SDImageCache* imageCache = [[SDWebImageManager sharedManager] imageCache];
dispatch_queue_t queue =imageCache .ioQueue;
NSFileManager* fm = [NSFileManager defaultManager];
__block NSError* error = nil;
__block NSUInteger fileSize = 0;
//獲取SD的緩存
[imageCache calculateSizeWithCompletionBlock:^(NSUInteger fileCount, NSUInteger totalSize) {
fileSize += totalSize;
}];
//獲取Books的緩存
dispatch_sync(queue, ^{
NSArray* subFiles = [fm subpathsAtPath:BOOKHEADERPath([LoginPlugin share].userID)];
NSLog(@"subpath = %@",subFiles);
for (NSString* fileName in subFiles) {
if ([fileName hasSuffix:@"png"]||[fileName hasSuffix:@"jpg"]) {
NSDictionary* dic = [fm attributesOfItemAtPath:BOOKPATH([LoginPlugin share].userID,fileName) error:&error];
NSUInteger size = (error ? 0:[dic fileSize]);
fileSize += size;
}
}
});
NSString* cacheString = [NSString stringWithFormat:@"%.1fM",fileSize/(1024.0*1024)];
NSTimeInterval time = [begin timeIntervalSinceNow];
NSLog(@"便利文件耗費時間:%lf",time/60.0);
return cacheString;
}
妥妥的,因為是個類方法,就不提供源代碼鳥!只需要替換下測試路徑就OK了!