前言:
之前學習了資料儲存的NSUserDefaults,歸檔和解檔,對於專案開發中如果要儲存一些檔案,比如圖片,音訊,視訊等檔案的時候就需要用到檔案儲存了。檔案沙盒儲存主要儲存非機密資料,大的資料。
接下來具體認識一下沙盒儲存:
每個ios應用都有自己的應用沙盒,應用沙盒就是檔案系統目錄,與其他應用的檔案系統隔離,ios系統不允許訪問其他應用的應用沙盒。在ios8中已經開放訪問。
應用沙盒一般包括以下幾個檔案目錄:應用程式包、Documents、Libaray(下面有Caches和Preferences目錄)、tmp。
應用程式包:包含所有的資原始檔和可執行檔案。
Documents:儲存應用執行時生成的需要持久化的資料,iTunes會自動備份該目錄。蘋果建議將程式中建立的或在程式中瀏覽到的檔案資料儲存在該目錄下,iTunes備份和恢復的時候會包括此目錄
tmp:儲存應用執行時所需的臨時資料,使用完畢後再將相應的檔案從該目錄刪除。應用沒有執行時,系統也有可能會清除該目錄下的檔案,iTunes不會同步該目錄。iphone重啟時,該目錄下的檔案會丟失。
Library:儲存程式的預設設定和其他狀態資訊,iTunes會自動備份該目錄。
Libaray/Caches:存放快取檔案,iTunes不會備份此目錄,此目錄下檔案不會在應用退出刪除。一般存放體積比較大,不是特別重要的資源。
Libaray/Preferences:儲存應用的所有偏好設定,ios的Settings(設定)應用會在該目錄中查詢應用的設定資訊,iTunes會自動備份該目錄。
具體獲取各個目錄程式碼如下:
// 獲得應用程式沙盒的Documents資料夾路徑 NSArray *arrDocumentPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *documentPath=[arrDocumentPaths objectAtIndex:0]; NSLog(@"Documents path: %@",documentPath); // 獲得應用程式沙盒的Caches資料夾路徑 NSArray *arrCachesPaths=NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES); NSString *CachesPath=[arrCachesPaths objectAtIndex:0]; NSLog(@"Caches path: %@",CachesPath); // 獲得應用程式沙盒的Downloads資料夾路徑 NSArray *arrDownloadPaths=NSSearchPathForDirectoriesInDomains(NSDownloadsDirectory,NSUserDomainMask,YES); NSString *loadPathsPath=[arrDownloadPaths objectAtIndex:0]; NSLog(@"Downloads path: %@",loadPathsPath); // 獲得應用程式沙盒的home資料夾路徑 NSString *homePath= NSHomeDirectory(); // 獲得應用程式沙盒的tmp資料夾路徑 NSString *TmpPath= NSTemporaryDirectory();
為了方便使用整理一個File工具類:
FileUtils.h
#import <Foundation/Foundation.h> @interface FileUtils : NSObject //返回快取根目錄 "caches" +(NSString *)getCachesDirectory; //返回根目錄路徑 "document" + (NSString *)getDocumentPath; //建立資料夾 +(BOOL)creatDir:(NSString*)dirPath; //刪除資料夾 +(BOOL)deleteDir:(NSString*)dirPath; //移動資料夾 +(BOOL)moveDir:(NSString*)srcPath to:(NSString*)desPath; //建立檔案 + (BOOL)creatFile:(NSString*)filePath withData:(NSData*)data; //讀取檔案 +(NSData*)readFile:(NSString *)filePath; //刪除檔案 +(BOOL)deleteFile:(NSString *)filePath; //返回 檔案全路徑 + (NSString*)getFilePath:(NSString*) fileName; //在對應檔案儲存資料 + (BOOL)writeDataToFile:(NSString*)fileName data:(NSData*)data; //從對應的檔案讀取資料 + (NSData*)readDataFromFile:(NSString*)fileName; @end
FileUtils.m
#import "FileUtils.h" @implementation FileUtils //返回快取根目錄 "caches" +(NSString *)getCachesDirectory { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *caches = [paths firstObject]; return caches; } //返回根目錄路徑 "document" + (NSString *)getDocumentPath { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentPath = [paths firstObject]; return documentPath; } //建立檔案目錄 +(BOOL)creatDir:(NSString*)dirPath { if ([[NSFileManager defaultManager] fileExistsAtPath:dirPath])//判斷dirPath路徑資料夾是否已存在,此處dirPath為需要新建的資料夾的絕對路徑 { return NO; } else { [[NSFileManager defaultManager] createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil];//建立資料夾 return YES; } } //刪除檔案目錄 +(BOOL)deleteDir:(NSString*)dirPath { if([[NSFileManager defaultManager] fileExistsAtPath:dirPath])//如果存在臨時檔案的配置檔案 { NSError *error=nil; return [[NSFileManager defaultManager] removeItemAtPath:dirPath error:&error]; } return NO; } //移動資料夾 +(BOOL)moveDir:(NSString*)srcPath to:(NSString*)desPath; { NSError *error=nil; if([[NSFileManager defaultManager] moveItemAtPath:srcPath toPath:desPath error:&error]!=YES)// prePath 為原路徑、 cenPath 為目標路徑 { NSLog(@"移動檔案失敗"); return NO; } else { NSLog(@"移動檔案成功"); return YES; } } //建立檔案 + (BOOL)creatFile:(NSString*)filePath withData:(NSData*)data { return [[NSFileManager defaultManager] createFileAtPath:filePath contents:data attributes:nil]; } //讀取檔案 +(NSData*)readFile:(NSString *)filePath { return [NSData dataWithContentsOfFile:filePath options:0 error:NULL]; } //刪除檔案 +(BOOL)deleteFile:(NSString *)filePath { return [self deleteDir:filePath]; } + (NSString *)getFilePath:(NSString *)fileName { NSString *dirPath = [[self getDocumentPath] stringByAppendingPathComponent:fileName]; return dirPath; } + (BOOL)writeDataToFile:(NSString*)fileName data:(NSData*)data { NSString *filePath=[self getFilePath:fileName]; return [self creatFile:filePath withData:data]; } + (NSData*)readDataFromFile:(NSString*)fileName { NSString *filePath=[self getFilePath:fileName]; return [self readFile:filePath]; } @end