iOS-清除快取(有用)

weixin_34293059發表於2018-05-29

封裝成一個工具類,實現2個類方法。
一言不合···上程式碼····

#define cachePath [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]

// 快取大小
+(NSString *)getCachesSize{
    // 除錯
#ifdef DEBUG
    
    // 如果資料夾不存在 or 不是一個資料夾, 那麼就丟擲一個異常
    // 丟擲異常會導致程式閃退, 所以只在除錯階段丟擲。釋出階段不要再拋了,--->影響使用者體驗
    
    BOOL isDirectory = NO;
    
    BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:cachePath isDirectory:&isDirectory];
    
    if (!isExist || !isDirectory) {
        
        NSException *exception = [NSException exceptionWithName:@"檔案錯誤" reason:@"請檢查你的檔案路徑!" userInfo:nil];
        
        [exception raise];
    }
    
    //釋出
#else
    
#endif
    
    //1.獲取“cachePath”資料夾下面的所有檔案
    NSArray *subpathArray= [[NSFileManager defaultManager] subpathsAtPath:cachePath];
    
    NSString *filePath = nil;
    long long totalSize = 0;
    
    for (NSString *subpath in subpathArray) {
        
        // 拼接每一個檔案的全路徑
        filePath =[cachePath stringByAppendingPathComponent:subpath];
        
        BOOL isDirectory = NO;   //是否資料夾,預設不是
        
        BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isDirectory];   // 判斷檔案是否存在
        
        // 檔案不存在,是資料夾,是隱藏檔案都過濾
        if (!isExist || isDirectory || [filePath containsString:@".DS"]) continue;
        
        // attributesOfItemAtPath 只可以獲得檔案屬性,不可以獲得資料夾屬性,
        //這個也就是需要遍歷資料夾裡面每一個檔案的原因
        
        long long fileSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil] fileSize];
        
        totalSize += fileSize;
        
    }
    
    // 2.將資料夾大小轉換為 M/KB/B
    NSString *totalSizeString = nil;
    
    if (totalSize > 1000 * 1000) {
        
        totalSizeString = [NSString stringWithFormat:@"%.1fM",totalSize / 1000.0f /1000.0f];
        
    } else if (totalSize > 1000) {
        
        totalSizeString = [NSString stringWithFormat:@"%.1fKB",totalSize / 1000.0f ];
        
    } else {
        
        totalSizeString = [NSString stringWithFormat:@"%.1fB",totalSize / 1.0f];
        
    }
    
    return totalSizeString;
    
}

// 清除快取
+ (void)removeCache{
    
    // 1.拿到cachePath路徑的下一級目錄的子資料夾
    // contentsOfDirectoryAtPath:error:遞迴
    // subpathsAtPath:不遞迴
    
    NSArray *subpathArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:cachePath error:nil];
    
    // 2.如果陣列為空,說明沒有快取或者使用者已經清理過,此時直接return
    if (subpathArray.count == 0) {
        [SVProgressHUD showNOmessage:@"快取已清理"];
        return ;
    }

    NSError *error = nil;
    NSString *filePath = nil;
    BOOL flag = NO;
    
    NSString *size = [self getCachesSize];
    
    for (NSString *subpath in subpathArray) {
        
        filePath = [cachePath stringByAppendingPathComponent:subpath];
        
        if ([[NSFileManager defaultManager] fileExistsAtPath:cachePath]) {
            
            // 刪除子資料夾
            BOOL isRemoveSuccessed = [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
            
            if (isRemoveSuccessed) { // 刪除成功
                
                flag = YES;
            }
        }
        
    }
    
    if (NO == flag)
        [SVProgressHUD showNOmessage:@"快取已清理"];
    else
        [SVProgressHUD showYESmessage:[NSString stringWithFormat:@"為您騰出%@空間",size]];
        
    return ;
    
}

相關文章