iOS開發 - 清空沙盒路徑下的緩存數據

引言:

移動應用在處理網絡資源時,一般都會做離線緩存處理,其中以圖片緩存最為典型,其中很流行的離線緩存框架為 SDWebImage 。
但是,離線緩存會占用手機存儲空間,所以緩存清理功能基本成為資訊、購物、閱讀類 App 的標配功能。
由于緩存文件是存在 App 的沙盒中,所以我們可以通過 NSFileManager API 來實現對緩存文件大小的計算和數據的刪除操作。

我們先來了解一下沙盒機制:

沙盒:iOS系統為每一個應用程序創建一個文件目錄,是一個的獨立,封閉,安全的空間, 一個沙盒就是一個文件目錄。沙盒規定了一個程序只能在自身的沙盒中進行操作,不能去訪問其他應用程序的沙盒(iOS8已經部分開放訪問)

沙盒的作用: 用來存放非代碼文件(圖片, 音頻, 視頻, 屬性列表(plist), sqlite數據庫, 文本文件, 其他等等)

沙盒中常用的幾個路徑:

Document文件夾
用來保存應由程序運行時生成的需要持久化的數據, iTunes會自動備份該目錄(蘋果公司建議將程序中創建的和瀏覽過的程序存放在這里,iTunes在備份和回復時會自動包含此目錄)。
獲取方法:

//文件路徑是數組,這里取第一個元素
NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];`

Library文件夾:
用來存儲程序的默認設置和其他狀態信息,iTunes也會自動備份該目錄。
獲取方法:

NSString *libraryPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES)[0];

Library/Caches:
用來存放緩存文件,iTunes不會備份此目錄,此目錄下的文件不會在程序退出后刪除,一般存放體積比較大但又不太重要的文件。
獲取方法:

NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];

**Library/Preferences: **
用來存儲用戶的偏好設置,iOS的setting(設置)會在這個目錄中查找應用程序的設置信息,iTunes會自動備份該目錄,通常這個文件夾都是由系統進行維護的,建議不要操作他。
系統沒有直接獲取這個文件夾路徑的方法,需要先獲取Library路徑然后進行字符串拼接找到此路徑:

NSString *libraryPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDoMainMask, YES)[0]; 
NSString*preferencePath = [libraryPath stringByAppendingString:@“/Preferences”];

注意:不要直接寫偏好設置到這個文件夾,而是通過NSUserDefaults來進行偏好設置的保存和讀取。

tmp:
保存應用程序的臨時文件夾,使用完畢后,將相應的文件從這個目錄中刪除,如果空間不夠,系統也可能會刪除這個目錄下的文件,iTunes不會同步這個文件夾,在iPhone重啟的時候,該目錄下的文件會被刪除。
這個路徑的獲取方法和其他的不同,它有自己方法:

NSString *tmpPath = NSTemporaryDirectory();

下面直接上代碼:

我們可以封裝成一個工具類: ClearCacheTool類。

ClearCacheTool.h文件:

#import <Foundation/Foundation.h>

@interface ClearCacheTool : NSObject

/*s*
 *  獲取path路徑下文件夾的大小
 *
 *  @param path 要獲取的文件夾 路徑
 *
 *  @return 返回path路徑下文件夾的大小
 */
+ (NSString *)getCacheSizeWithFilePath:(NSString *)path;

/**
 *  清除path路徑下文件夾的緩存
 *
 *  @param path  要清除緩存的文件夾 路徑
 *
 *  @return 是否清除成功
 */
+ (BOOL)clearCacheWithFilePath:(NSString *)path;

ClearCacheTool.m文件:

#import "ClearCacheTool.h"

@implementation ClearCacheTool

#pragma mark - 獲取path路徑下文件夾大小
+ (NSString *)getCacheSizeWithFilePath:(NSString *)path{
    
    // 獲取“path”文件夾下的所有文件
    NSArray *subPathArr = [[NSFileManager defaultManager] subpathsAtPath:path];
    
    NSString *filePath  = nil;
    NSInteger totleSize = 0;
    
    for (NSString *subPath in subPathArr){
        
        // 1. 拼接每一個文件的全路徑
        filePath =[path stringByAppendingPathComponent:subPath];
        // 2. 是否是文件夾,默認不是
        BOOL isDirectory = NO;
        // 3. 判斷文件是否存在
        BOOL isExist = [[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:&isDirectory];
        
        // 4. 以上判斷目的是忽略不需要計算的文件
        if (!isExist || isDirectory || [filePath containsString:@".DS"]){
            // 過濾: 1. 文件夾不存在  2. 過濾文件夾  3. 隱藏文件
            continue;
        }
        
        // 5. 指定路徑,獲取這個路徑的屬性
        NSDictionary *dict = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
        /**
         attributesOfItemAtPath: 文件夾路徑
         該方法只能獲取文件的屬性, 無法獲取文件夾屬性, 所以也是需要遍歷文件夾的每一個文件的原因
         */
        
        // 6. 獲取每一個文件的大小
        NSInteger size = [dict[@"NSFileSize"] integerValue];
        
        // 7. 計算總大小
        totleSize += size;
    }
    
    //8. 將文件夾大小轉換為 M/KB/B
    NSString *totleStr = nil;
    
    if (totleSize > 1000 * 1000){
        totleStr = [NSString stringWithFormat:@"%.2fM",totleSize / 1000.00f /1000.00f];
        
    }else if (totleSize > 1000){
        totleStr = [NSString stringWithFormat:@"%.2fKB",totleSize / 1000.00f ];
        
    }else{
        totleStr = [NSString stringWithFormat:@"%.2fB",totleSize / 1.00f];
    }
    
    return totleStr;
}


#pragma mark - 清除path文件夾下緩存大小
+ (BOOL)clearCacheWithFilePath:(NSString *)path{
    
    //拿到path路徑的下一級目錄的子文件夾
    NSArray *subPathArr = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:nil];
    
    NSString *filePath = nil;
    
    NSError *error = nil;
    
    for (NSString *subPath in subPathArr)
    {
        filePath = [path stringByAppendingPathComponent:subPath];
        
        //刪除子文件夾
        [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];
        if (error) {
            return NO;
        }
    }
    return YES;
}

使用的時候只需要傳入路徑就可以了?。?!
<br />
本篇文章對應的源代碼下載地址:ClearCacheDemo
<br />
<br />


GitHub: https://github.com/LiCheng244/LCUtils
個人博客: http://www.licheng244.com/


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,836評論 6 540
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,275評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,904評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,633評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,368評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,736評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,740評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,919評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,481評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,235評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,427評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,968評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,656評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,055評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,348評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,160評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,380評論 2 379

推薦閱讀更多精彩內容