天天看點

iOS 開發之沙盒機制 & 檔案操作 (NSFielManager)

原文連結: http://www.jianshu.com/p/349855b5a8ae iOS APP 可以在自己的沙盒裡讀寫檔案,但是,不可以通路其他 APP 的沙盒。每一個 APP 都是一個資訊孤島,互相是不可以進行通信的,唯獨可以通過 URL Scheme。沙盒裡面的檔案可以是照片、聲音檔案、文本、屬性清單等。 —— 由 膜法小編分享

沙盒機制

iOS APP可以在自己的沙盒裡讀寫檔案,但是,不可以通路其他APP的沙盒。每一個APP都是一個資訊孤島,互相是不可以進行通信的,唯獨可以通過

URL Scheme

。沙盒裡面的檔案可以是照片、聲音檔案、文本、屬性清單等。

沙河盒根目錄的結構
  • Documents:用于存儲使用者資料,iTunes備份和恢複的時候會包含此目錄。是以,蘋果建議将程式中建立的或在程式中浏覽到的資料儲存在該目錄下
  • Library
    • Caches :Caches用來存放使用者需要換成的檔案
    • Preferences :Preferences是APP的偏好設定,可以通過NSUserDefaults來讀取和設定
  • tmp:用于存放臨時檔案,這個可以放一些當APP退出後不再需要的檔案。
iOS 開發之沙盒機制 & 檔案操作 (NSFielManager)

62317-e49c692cb5d9ebb3.png

路徑擷取

1、擷取沙盒根目錄

NSString *directory = NSHomeDirectory();
    NSLog(@"directory:%@", directory);
           

列印結果

2、擷取Documents路徑

參數的意義:

iOS 開發之沙盒機制 & 檔案操作 (NSFielManager)

21BD09BC-4F15-4FDD-AF3E-A5D3FA2EF2BB.png

/*
     第一個參數:指定了搜尋的路徑的名稱:NSDocumentDirectory 表示是在Documents中尋找。NSCacheDirectory的話就是在cache檔案中尋找
     第二個參數:第二個參數限定了檔案的檢索範圍隻在沙箱内部.其意義為使用者電腦主目錄.也可以修改為網絡主機等
     第三個參數:最後一個參數決定了是否展開波浪線符号.展開後才是完整路徑,這個布爾值一直為YES.
     */
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSLog(@"paths.count:%ld",paths.count);
    for (NSInteger i = ; i < paths.count; i++) {
        NSString *path = paths[i];
        NSLog(@"path:%@",path);
    }
           

列印結果:

iOS 開發之沙盒機制 &amp; 檔案操作 (NSFielManager)

0C469A95-2A42-41C4-AA77-2EB6D97917E2.png

列印的路徑

3、擷取Library路徑

//擷取Library路徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:];
NSLog(@"path:%@", path);
           

列印結果

4、擷取Caches路徑

//擷取Caches路徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:];
NSLog(@"path:%@", path);
           

列印結果

5、擷取tmp路徑

NSString *tmp = NSTemporaryDirectory();
NSLog(@"tmp:%@", tmp);
           

列印結果

打開沙盒方法

finder前往

iOS 開發之沙盒機制 &amp; 檔案操作 (NSFielManager)

螢幕快照 2017-04-12 上午11.11.28.png

直接在Finder->前往->前往檔案夾,輸入上面的内容即可

檔案操作

NSFileManager:NSFileManager是用來管理檔案系統的,它可以用來進行常見的檔案\檔案夾操作(拷貝、剪切、建立等)

NSFileManager使用了單例模式singleton

使用defaultManager方法可以獲得那個單例對象

[NSFileManager defaultManager]

檔案的增删改查

1、建立檔案夾

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = [paths objectAtIndex:];

    //建立檔案夾的路徑
    NSString *testPath = [documentsPath stringByAppendingPathComponent:@"test"];
    //建立目錄
    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL rest = [fileManager createDirectoryAtPath:testPath withIntermediateDirectories:YES attributes:nil error:nil];
    if (rest) {
        NSLog(@"檔案夾建立成功:%@",testPath);
    }else{
        NSLog(@"檔案夾建立失敗");
    }
           

列印結果

檔案夾建立成功:/Users/jiangjunuhi/Library/Developer/CoreSimulator/Devices/C61-E6B--A-CA75FDC83/data/Containers/Data/Application/FC2F96A3-A5A6-BC9-A551-F9F247F9D/Documents/test
           

2、建立檔案

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = [paths objectAtIndex:];

    NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];
    BOOL res=[fileManager createFileAtPath:testPath contents:nil attributes:nil];
    if (res) {
        NSLog(@"檔案建立成功: %@" ,testPath);
    }else{
        NSLog(@"檔案建立失敗");
    }
           

列印結果

3、寫資料到檔案

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = [paths objectAtIndex:];

    NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
    NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];
    NSString *content=@"測試寫入内容!";
    BOOL res=[content writeToFile:testPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
    if (res) {
        NSLog(@"檔案寫入成功:%@",testPath);
    }else
        NSLog(@"檔案寫入失敗");
           

4、讀檔案資料

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsPath = [paths objectAtIndex:];
NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];  
    NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];  
//    NSData *data = [NSData dataWithContentsOfFile:testPath];  
//    NSLog(@"檔案讀取成功: %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);  
    NSString *content=[NSString stringWithContentsOfFile:testPath encoding:NSUTF8StringEncoding error:nil];  
    NSLog(@"檔案讀取成功: %@",content);
           

5、删除檔案

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];  
    NSFileManager *fileManager = [NSFileManager defaultManager];  
    NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];     
    BOOL res=[fileManager removeItemAtPath:testPath error:nil];  
    if (res) {  
        NSLog(@"檔案删除成功");  
    }else  
        NSLog(@"檔案删除失敗");     
    NSLog(@"檔案是否存在: %@",[fileManager isExecutableFileAtPath:testPath]?@"YES":@"NO");  
}
           
2、檔案的一些常用方法

1、判斷檔案是否存在

//建立檔案管理對象
    //調用defaultManager 建立一個檔案管理的單例對象
    //單例對象:在程式運作期間,隻有一個對象存在
    NSFileManager *fm = [NSFileManager defaultManager];
    // YES 存在   NO 不存在
    BOOL isYES = [fm fileExistsAtPath:filePath];
    NSLog(@"-->%d",isYES);
           

2、判斷是否是一個目錄

if(isYES){
        BOOL isDir;

        // 2) 判斷是否是一個目錄
        [fm fileExistsAtPath:filePath isDirectory:&isDir];

        if (isDir) {
            NSLog(@"這是一個目錄");
        }else{

            NSLog(@"這不是一個目錄");
        }

    }
           

3、判斷檔案是否可讀 4、是否可寫 5、是否可删除 6、擷取檔案的資訊(屬性)

//建立檔案對象
    NSFileManager *fm = [NSFileManager defaultManager];
    NSString *filePath = @"/Users/zhaoxiaohu/Desktop/arr.plist";

    NSString *dirPath = @"/Users/zhaoxiaohu/Desktop/a";

    //1)如何擷取檔案的資訊(屬性)
    NSDictionary *dict = [fm attributesOfItemAtPath:filePath error:nil];
    NSLog(@"%@",dict);
    NSLog(@"%@,%@",[dict objectForKey:@"NSFileOwnerAccountName"],dict[@"NSFileOwnerAccountName"]);
           

7、copy檔案

//如何copy檔案
    NSString *targetPath = @"/Users/zhaoxiaohu/Desktop/aaa/ccc/love.txt";
    [fm copyItemAtPath:createDirPath toPath:targetPath error:nil];

     NSString *targetPath = @"/Users/zhaoxiaohu/Desktop/aaa/love.txt";
           

8、移動檔案

[fm moveItemAtPath:createDirPath toPath:targetPath error:nil];
           

繼續閱讀