項目中碰到一個需要計算沙盒目錄的大小的功能。
看了下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了!