IOS 沙盒與清除緩存


SandBox,沙盒機制,是一種安全體系。我們所開發的每一個應用程序在設備上會有一個對應的沙盒文件夾,當前的程序只能在自己的沙盒文件夾中讀取文件,不能訪問其他應用程序的沙盒。在項目中添加的所有非代碼的資源,比如圖片、聲音、屬性列表等都存在自己的沙盒中。此外,在程序運行中動態生成的或者從網絡獲取的數據,如果要存儲,也都是存儲到沙盒中。

沙盒中的默認文件夾

(1)Documents:蘋果建議將程序中建立的或在程序中瀏覽到的文件數據保存在該目錄下,iTunes備份和恢復的時候會包括此目錄

(2)Library:存儲程序的默認設置或其它狀態信息;

里面又包含兩個文件夾Caches和Preference;

Caches,存放緩存文件,iTunes不會備份此目錄

(3)tmp:提供一個即時創建臨時文件的地方

獲取沙盒中的不同目錄

代碼

//  JRSandBoxPath.h
//  Fmdb
//
//  Created by jerei on 15-10-30.
//  Copyright (c) 2015年 jerei. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface JRSandBoxPath: NSObject

// 獲取沙盒Document的文件目錄
+ (NSString *)getDocumentDirectory;

// 獲取沙盒Library的文件目錄
+ (NSString *)getLibraryDirectory;

// 獲取沙盒Library/Caches的文件目錄
+ (NSString *)getCachesDirectory;

// 獲取沙盒Preference的文件目錄
+ (NSString *)getPreferencePanesDirectory;

// 獲取沙盒tmp的文件目錄
+ (NSString *)getTmpDirectory;
@end

//
//  JRSandBoxPath.m
//  Fmdb
//
//  Created by jerei on 15-10-30.
//  Copyright (c) 2015年 jerei. All rights reserved.
//

#import " JRSandBoxPath.h"

@implementation JRSandBoxPath

#pragma mark - 獲取沙盒Document的文件目錄
+ (NSString *)getDocumentDirectory{
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

#pragma mark - 獲取沙盒Library的文件目錄
+ (NSString *)getLibraryDirectory{
    return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
}

#pragma mark - 獲取沙盒Library/Caches的文件目錄
+ (NSString *)getCachesDirectory{
    return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
}

#pragma mark - 獲取沙盒Preference的文件目錄
+ (NSString *)getPreferencePanesDirectory{
    return [NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSUserDomainMask, YES) lastObject];
}

#pragma mark - 獲取沙盒tmp的文件目錄
+ (NSString *)getTmpDirectory{
    return
    NSTemporaryDirectory();
}

@end

清除緩存

在開發的過程中,遇到有用的數據,會進行緩存,當該數據不需要時,可以清除。在這里整理了幾個方法,統計問價的大小,清除指定文件,清除指定目錄下的全部文件等。

代碼

//  JRCleanCaches.h
//  Fmdb
//
//  Created by jerei on 15-10-30.
//  Copyright (c) 2015年 jerei. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface JRCleanCaches : NSObject

// 根據路徑返回目錄或文件的大小
+ (double)sizeWithFilePath:(NSString *)path;

// 得到指定目錄下的所有文件
+ (NSArray *)getAllFileNames:(NSString *)dirPath;

// 刪除指定目錄或文件
+ (BOOL)clearCachesWithFilePath:(NSString *)path;

// 清空指定目錄下文件
+ (BOOL)clearCachesFromDirectoryPath:(NSString *)dirPath;

@end

//
//  JRCleanCaches.m
//  Fmdb
//
//  Created by jerei on 15-10-30.
//  Copyright (c) 2015年 jerei. All rights reserved.
//

#import "JRCleanCaches.h"

@implementation JRCleanCaches

#pragma mark - 根據路徑返回目錄或文件的大小
+ (double)sizeWithFilePath:(NSString *)path{
    // 1.獲得文件夾管理者
    NSFileManager *manger = [NSFileManager defaultManager];
    
    // 2.檢測路徑的合理性
    BOOL dir = NO;
    BOOL exits = [manger fileExistsAtPath:path isDirectory:&dir];
    if (!exits) return 0;
    
    // 3.判斷是否為文件夾
    if (dir) { // 文件夾, 遍歷文件夾里面的所有文件
        // 這個方法能獲得這個文件夾下面的所有子路徑(直接\間接子路徑)
        NSArray *subpaths = [manger subpathsAtPath:path];
        int totalSize = 0;
        for (NSString *subpath in subpaths) {
            NSString *fullsubpath = [path stringByAppendingPathComponent:subpath];
            
            BOOL dir = NO;
            [manger fileExistsAtPath:fullsubpath isDirectory:&dir];
            if (!dir) { // 子路徑是個文件
                NSDictionary *attrs = [manger attributesOfItemAtPath:fullsubpath error:nil];
                totalSize += [attrs[NSFileSize] intValue];
            }
        }
        return totalSize / (1024 * 1024.0);
    } else { // 文件
        NSDictionary *attrs = [manger attributesOfItemAtPath:path error:nil];
        return [attrs[NSFileSize] intValue] / (1024.0 * 1024.0);
    }
}

#pragma mark - 得到指定目錄下的所有文件
+ (NSArray *)getAllFileNames:(NSString *)dirPath{
    NSArray *files = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:dirPath error:nil];
    return files;
}

#pragma mark - 刪除指定目錄或文件
+ (BOOL)clearCachesWithFilePath:(NSString *)path{
    NSFileManager *mgr = [NSFileManager defaultManager];
    return [mgr removeItemAtPath:path error:nil];
}

#pragma mark - 清空指定目錄下文件
+ (BOOL)clearCachesFromDirectoryPath:(NSString *)dirPath{
    
    //獲得全部文件數組
    NSArray *fileAry =  [JRCleanCaches getAllFileNames:dirPath];
    //遍歷數組
    BOOL flag = NO;
    for (NSString *fileName in fileAry) {
        NSString *filePath = [dirPath stringByAppendingPathComponent:fileName];
        flag = [JRCleanCaches clearCachesWithFilePath:filePath];
        
        if (!flag)
            break;
    }
    
    return flag;
}

@end

 

作者:傑瑞教育
出處: http://www.cnblogs.com/jerehedu/ 
版權聲明:本文版權歸 傑瑞教育 技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
技術咨詢:JRedu技術交流
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM