iOS沙盒機制

1、簡介緩存

  • 每一個iOS應用都有本身的應用沙盒(應用沙盒就是文件系統目錄),與其餘文件系統隔離。網絡

    • 應用必須待在本身的沙盒裏,其餘應用不能訪問該沙盒atom

2、應用沙盒目錄spa

  • Application應用程序包:包含了全部的資源文件和和可執行文件,上架前通過數字簽名,上架後不可修改code

  • Documents:保存應用程序自己運行時產生的文件或者數據,iCloud備份目錄,例如:遊戲進度、塗鴉軟件的繪圖orm

    • 注意點:不要保存從網絡上下載的文件,不然會沒法上架!對象

  • Library遊戲

    • 用戶偏好,使用 NSUserDefault 直接讀寫!圖片

    • 若是要想數據及時寫入磁盤,還須要調用一個同步方法資源

    • 保存臨時文件,"後續須要使用",例如:緩存圖片,離線數據(地圖數據)

    • 系統不會清理 cache 目錄中的文件

    • 就要求程序開發時,"必須提供 cache 目錄的清理解決方案"

    • Caches:存放體積大又不須要備份的數據

    • Preference:保存應用的全部偏好設置,iCloud會備份設置信息

  • tmp:存放臨時文件,不會被備份,並且這個文件下的數據有可能隨時被清除的可能

    • 保存臨時文件,"後續不須要使用"

    • tmp 目錄中的文件,系統會自動清理

    • 從新啓動手機,tmp 目錄會被清空

    • 系統磁盤空間不足時,系統也會自動清理

3、應用沙盒目錄的常見獲取方式

        // 沙盒根目錄
        NSString *homeDir = NSHomeDirectory();
        NSLog(@"homeDir: %@", homeDir);
        
        // 獲取tmp目錄
        NSString *tmpDir = NSTemporaryDirectory();
        NSLog(@"tmpDir: %@", tmpDir);
        
        // NSUserDomainMask 表明從用戶文件夾下找
        // YES 表明展開路徑中的波浪字符「~」
        // 在iOS中,只有一個目錄跟傳入的參數匹配,因此這個集合裏面只有一個元素NSString*documents =[array objectAtIndex:0];
        NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO) objectAtIndex:0];
        NSLog(@"Documents: %@", documents);
        
        // 獲取Documents目錄
        // NSSearchPathForDirectoriesInDomains(要查找的目錄, 是不是用戶主目錄, YES/NO 是否獲取全路徑);
        NSArray *arr1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSLog(@"Documents: %@", [arr1 lastObject]);
        
        // 獲取Library目錄
        NSArray *arr2 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
        NSLog(@"Library: %@", [arr2 lastObject]);
        
        // 獲取Library/Caches目錄
        NSArray *arr3 = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
        NSLog(@"Caches: %@", [arr3 lastObject]);
        
        // 獲取Library/Preferences目錄
        NSArray *arr4 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
        NSString *path = [arr4 lastObject];
        path = [path stringByAppendingPathComponent:@"Preferences"];
        NSLog(@"Preferences: %@", path);
        
        // 寫入文件到指定的文件夾下
        NSString *path2 = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, NO) objectAtIndex:0];
        path2 = [path2 stringByAppendingPathComponent:@"Preferences/test.txt"];
        NSString *str = @"Jacedy";
        [str writeToFile:path2 atomically:YES encoding:NSUTF8StringEncoding error:nil];
        
        // 建立目錄
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSString *testDir = [path2 stringByAppendingPathComponent:@"test"];
        [fileManager createDirectoryAtPath:testDir withIntermediateDirectories:YES attributes:nil error:nil];
        if ([fileManager fileExistsAtPath:testDir]) {
            NSLog(@"It is exist");
        }


// 文件操做
- (void)fileManage
{
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    
#pragma mark - NSString寫入文件
    NSString *txtPath = [docPath stringByAppendingPathComponent:@"bada.txt"];// 此時僅存在路徑,文件並無真實存在
    NSString *string = @"莽荒記";
    [string writeToFile:txtPath atomically:YES encoding:NSUTF8StringEncoding error:nil];// 字符串寫入時執行的代碼
    NSLog(@"%@", txtPath);
    
#pragma mark - NSData寫入文件
    NSString *dataPath = [docPath stringByAppendingPathComponent:@"icon.jpg"];
    UIImage *image = [UIImage imageNamed:@"640*960.jpg"];
    NSData *data = UIImageJPEGRepresentation(image, 1.0);
    [data writeToFile:dataPath atomically:YES];
    NSLog(@"dataPath: %@", dataPath);
    
#pragma mark - 建立文件夾
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *testDir = [docPath stringByAppendingPathComponent:@"test"];
    [fileManager createDirectoryAtPath:testDir withIntermediateDirectories:YES attributes:nil error:nil];
    if ([fileManager fileExistsAtPath:testDir]) {
        NSLog(@"It is exist");
    }
    // 獲取默認問價或者某個文件夾的大小
    NSDictionary *dic = [fileManager attributesOfItemAtPath:docPath error:nil];
    NSLog(@"dic: %@", dic);
    NSNumber *number = [dic objectForKey:NSFileSize];
    NSLog(@"number: %@", number);
    
}


// 文件移動
- (void)fileMove
{
#pragma mark - 文件移動
    // 建立文件夾
    NSString *docPath1 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *dirPath = [docPath1 stringByAppendingPathComponent:@"path"];
    NSFileManager *fileManager1 = [NSFileManager defaultManager];
    [fileManager1 createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil];
    
    // 建立文件
    NSString *filePath = [dirPath stringByAppendingPathComponent:@"test1.txt"];
    [fileManager1 createFileAtPath:filePath contents:nil attributes:nil];
    
    // 將圖片對象存入到該文件中
    UIImage *image1 = [UIImage imageNamed:@"640*960.jpg"];
    NSData *data1 = UIImageJPEGRepresentation(image1, 1.0);
    [data1 writeToFile:filePath atomically:YES];
    NSLog(@"%@", filePath);
    
    // 移動文件
    NSString *desPath = [docPath1 stringByAppendingPathComponent:@"test1.txt"];
    [fileManager1 moveItemAtPath:filePath toPath:desPath error:nil];
}


// 文件更改
- (void)changeFile
{
    // 1.獲取Documents路徑
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    // 2.建立文件路徑
    NSString *filePath = [docPath stringByAppendingPathComponent:@"text.txt"];
    // 3.使用文件管理對象建立文件
    NSFileManager *fileManager = [NSFileManager defaultManager];
    [fileManager createFileAtPath:filePath contents:[@"abcdefg" dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
    // 4.建立文件對接對象
    NSFileHandle *handle = [NSFileHandle fileHandleForUpdatingAtPath:filePath];// 文件對象此時針對文件,可讀可寫
    // 5.將偏移量移動到3的位置
    [handle seekToFileOffset:3];
    // 6.寫入數據
    [handle writeData:[@"1234" dataUsingEncoding:NSUTF8StringEncoding]];
    // 7.執行完操做後,關閉文件
    [handle closeFile];
    
    NSLog(@"%@", filePath);
}
相關文章
相關標籤/搜索