iOS沙盒存儲的基本使用

簡介

iOS 應(yīng)用程序在安裝時,會創(chuàng)建屬于自己的沙盒文件(standbox)。應(yīng)用程序中所有的非代碼文件都保存在沙盒中,如圖片、聲音、屬性列表,sqlite數(shù)據(jù)庫和文本文件等。
在沙盒機制下,每個應(yīng)用程序之間的文件夾不能互相訪問。iOS系統(tǒng)為了保證系統(tǒng)安全,采用了這種機制。
其原理是通過重定向技術(shù),把應(yīng)用程序生成和修改的文件,定向到自身文件夾中。

沙盒目錄組成

沙盒的的根目錄有三個文件夾:Documents,Library,tmp


image.png

image.png

子目錄有Caches、Preferences等文件夾,其中 Documents 和 Preferences 會被 iCloud 同步。

值得注意的是,NSUserDefaults是存儲在 Preferences 下的文件,發(fā)現(xiàn)有很多開發(fā)者為了偷懶,頻繁的使用NSUserDefaults做任意數(shù)據(jù)的磁盤緩存。
這是一個很不合理的做法,用處不大。且大量的數(shù)據(jù)一般緩存在 Caches 中。就算是從技術(shù)角度考慮,NSUserDefaults是以 .plist 形式存儲的,不適合大數(shù)據(jù)存儲。

查找文件路徑

NSSearchPathForDirectoriesInDomains()是用來查找文件路徑的函數(shù)。

返回值:是一個數(shù)組,其中只有一個NSString元素,即查找的路徑。
參數(shù)1:NSDocumentDirectory表示需要查找的目錄
參數(shù)2:NSUserDomainMask表示在用戶的主目錄中查找
參數(shù)3:YES表示返回路徑展開

  • 沙盒根目錄的路徑
    通過NSHomeDirectory()獲取沙盒路徑。
NSString *path = NSHomeDirectory();
NSLog(@"%@", path);
  • 獲取Documents目錄的路徑
    參數(shù)1是NSDocumentDirectory
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;

  • 獲取Library目錄的路徑
    參數(shù)1是NSLibraryDirectory
NSString *path = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).lastObject;

  • 獲取Caches目錄的路徑
    參數(shù)1是NSCachesDirectory
 NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;

此目錄用來保存應(yīng)用程序運行時,生成的需要持久化的數(shù)據(jù),這些數(shù)據(jù)一般存儲體積較大,又不十分重要,如網(wǎng)絡(luò)請求數(shù)據(jù)等。需要用戶負責刪除。

  • 獲取Preferences目錄的路徑
NSString *path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"Preferences"];

此目錄保存應(yīng)用程序的所有偏好設(shè)置,iOS的Settings(設(shè)置)應(yīng)用會在該目錄中查找應(yīng)用的設(shè)置信息。

  • 獲取tmp文件路徑
NSString *path = NSTemporaryDirectory();

此目錄保存應(yīng)用程序運行時,所需的臨時數(shù)據(jù),使用完畢后再將相應(yīng)的文件從該目錄刪除。應(yīng)用沒有運行時,系統(tǒng)也可能會清除該目錄下的文件。

保存圖片到沙盒

    UIImage *currentImage  = photos[i];
    NSData *imageData = UIImageJPEGRepresentation(currentImage, 0.5);
   // 獲取沙盒路徑
    NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:[NSString stringWithFormat:@"%zd.png",i]];
    // 寫入
    [imageData writeToFile:fullPath atomically:YES];   

從沙盒讀取圖片

// 讀取圖片
NSString * fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Docments"] stringByAppendingPathComponent:@"currentImage.png"];
UIImage * savedImage = [[UIImage alloc] initWithContentsOfFile:fullPath];

刪除沙盒文件

-(void)deleteFile {
    NSFileManager * fileManager = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    
    //文件名
    NSString *uniquePath=[[paths objectAtIndex:0] stringByAppendingPathComponent:@"pin.png"];
    BOOL isExit =[[NSFileManager defaultManager] fileExistsAtPath:uniquePath];
    if (! isExit) {
        NSLog(@"not exit !");
        return ;
    }else {
        BOOL isDele= [fileManager removeItemAtPath:uniquePath error:nil];
        if (isDele) 
            NSLog(@"delete success");
    }
}

得到沙盒中的所有文件

    NSFileManager *fileManager = [NSFileManager defaultManager];
    
    NSString *document=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *folder =[document stringByAppendingPathComponent:@"folder"];
    NSArray *fileList ;
    fileList =[fileManager contentsOfDirectoryAtPath:folder error:NULL];
    
    for (NSString *file in fileList) {
        NSLog(@"file=%@",file);
        NSString *path =[folder stringByAppendingPathComponent:file];
        NSLog(@"得到的路徑=%@",path);
    }

計算文件大小

- (long long)fileSizeAtPath:(NSString *)path
{
    NSFileManager *fileManager = [NSFileManager defaultManager];

    if ([fileManager fileExistsAtPath:path])
    {
        long long size = [fileManager attributesOfItemAtPath:path error:nil].fileSize;
        return size;
    }

    return 0;
}

文件夾大小

- (long long)folderSizeAtPath:(NSString *)path
{
    NSFileManager *fileManager = [NSFileManager defaultManager];

    long long folderSize = 0;

    if ([fileManager fileExistsAtPath:path])
    {
        NSArray *childerFiles = [fileManager subpathsAtPath:path];
        for (NSString *fileName in childerFiles)
        {
            NSString *fileAbsolutePath = [path stringByAppendingPathComponent:fileName];
            if ([fileManager fileExistsAtPath:fileAbsolutePath])
            {
                long long size = [fileManager attributesOfItemAtPath:fileAbsolutePath error:nil].fileSize;
                folderSize += size;
            }
        }
    }

    return folderSize;
}

相關(guān)資料

http://www.itdecent.cn/p/0913b8b6c858
http://www.itdecent.cn/p/0dbe875d7723
http://www.itdecent.cn/p/dd3f120eb249

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 不知不覺2017年的余額已經(jīng)所剩無幾了 下面是我這一年來收藏的關(guān)于IOS開發(fā)的一些知識點 . iOS功能 iOS ...
    臨淵還在閱讀 764評論 0 0
  • iOS功能 iOS 如何跳轉(zhuǎn)到系統(tǒng)設(shè)置里的指定子功能界面 http://blog.csdn.net/jingfa1...
    EmmaLyx閱讀 760評論 0 4
  • 1、 沙盒概念基本介紹 iOS 應(yīng)用程序只能在該 app 的文件系統(tǒng)中讀取。這個默認的 app 文件系統(tǒng)就是我們說...
    Laughingg閱讀 2,932評論 2 10
  • 我經(jīng)常在要寫東西的時候找不到寫作軟件,因為我經(jīng)常把它們丟到奇奇怪怪的分類中去。 譬如今天,一個陌生男人對我說,他已...
    陰天的鬼閱讀 328評論 0 1
  • 秋風漸涼,這幾天,各地正陸續(xù)開學。一位媽媽為他剛剛?cè)雽W的孩子寫下了這樣一些文字—— 孩子,陪你去報名,看著你背著大...
    鏡心源閱讀 410評論 0 0

友情鏈接更多精彩內(nèi)容