IOS 計算沙盒中一個目錄的大小 – iPhone手機開發技術文章 iPhone軟體開發教學課程

項目中碰到一個需要計算沙盒目錄的大小的功能。

看瞭下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;
}

不要擔心便利太多文件會影響效率,系統便利10M的文件僅耗費瞭0.00025S。這個也不是絕對的,需要自己親自調試瞭

 

 

在我的項目還有另一個問題,我要統計緩存,因為我用瞭SDWebImage,所以要整合我自己下載的圖書還有SDImageCache;

查看瞭下SDImageCache的代碼,其中提供瞭一個方法:大笑

 

- (void)calculateSizeWithCompletionBlock:(SDWebImageCalculateSizeBlock)completionBlock;

內部實現是在一個串行的queue中便利,然後通過block回調。

 

但是如果碰到我上邊寫的代碼有個返回值的,就有問題瞭。

因為我不可能在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瞭!

 

 

 

 

You May Also Like