1.沙盒機制
iOS采用沙盒機制管理應用,應用只能訪問自己目錄下的文件。iOS不像Android,沒有SD卡概念,不能直接訪問圖像、視頻等內容。iOS應用產生的內容,如圖像、文件、緩存內容等都必須存儲在自己的沙盒內。默認情況下,每個沙盒含有3個文件夾:Documents, Library 和 tmp。Library包含Caches、Preferences目錄。
我們無法在未越獄的真機中看到沙盒的內容(這保證了應用數據的安全性),但是我們可以看到模擬器的沙盒的內容,從而方便調試,沙盒的內容,一般在類似如下路徑:
~/Library/Developer/CoreSimulator/Devices/E0D702A7-D760-44F9-9226-FD176E80C158/data/Containers/Data/Application/02A2499B-A34E-4A86-B555-5DB9179521DB/
沙盒路徑非常復雜,所以推薦使用SimPolders2 Mac應用來查找應用沙盒的路徑
2.目錄結構
下面介紹一下沙盒內各個路徑的用途:
Documents:蘋果建議將程序創建產生的文件以及應用瀏覽產生的文件數據保存在該目錄下,iTunes備份和恢復的時候會包括此目錄。
Library:存儲程序的默認設置或其它狀態信息。
Library/Preferences:存放用戶偏好設置信息。
Library/Caches:存放緩存文件,保存應用的持久化數據,用于應用升級或者應用關閉后的數據保存,不會被itunes同步,所以為了減少同步的時間,可以考慮將一些比較大的文件而又不需要備份的文件放到這個目錄下。
tmp:提供一個即時創建臨時文件的地方,但不需要持久化,在應用關閉后,該目錄下的數據將刪除,也可能系統在程序不運行的時候清除。
3.代碼操作
//獲取沙盒根目錄
+(NSString*)homeDirectory{
return NSHomeDirectory();
}
//獲取Documents目錄
+(NSString *)documentDirectory{
//[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
return documentsDirectory;
}
//獲取Cache目錄
+(NSString *)cacheDirectory{
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
return cachePath;
}
//獲取tmp目錄
+(NSString *)tmpDirectory{
return NSTemporaryDirectory();
}
//文件或文件夾是否存在
+(BOOL)fileExistInPath:(NSString*)path isDirectory:(nullable BOOL *)isDirectory{
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL existed = [fileManager fileExistsAtPath:path isDirectory:isDirectory];
return existed;
}
//創建文件夾
+(BOOL)createDirectoryInPath:(NSString*)path directoryName:(NSString*)name{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *newDirectory = [path stringByAppendingPathComponent:name];
// 創建目錄
BOOL res = [fileManager createDirectoryAtPath:newDirectory withIntermediateDirectories:YES attributes:nil error:nil];
if (res) {
//文件夾創建成功
return YES;
}else{
//文件夾創建失敗
return NO;
}
}
//創建文件
+(BOOL)createFileInPath:(NSString*)path fileName:(NSString*)fileName{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *newFilePath = [path stringByAppendingPathComponent:fileName];
BOOL res = [fileManager createFileAtPath:newFilePath contents:nil attributes:nil];
if (res) {
//文件創建成功
return YES;
}else{
//文件創建失敗
return NO;
}
}
//寫文件
+(BOOL)writeStringToFile:(NSString*)string inPath:(NSString*)path{
BOOL res=[string writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
if (res) {
//文件寫入成功
return YES;
}else{
//文件寫入失敗
return NO;
}
}
//讀文件
+(NSString*)readFileInPath:(NSString*)path{
NSString *content=[NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
return content;
}
//文件屬性
+(NSDictionary *)fileAttriutesInPath:(NSString*)path{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:path error:nil];
return [fileAttributes copy];
}
//刪除文件
+(BOOL)deleteFileInPath:(NSString*)path{
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL res = [fileManager removeItemAtPath:path error:nil];
if (res) {
//文件刪除成功
return YES;
}else{
//文件刪除失敗
return NO;
}
}
4. GitHub
整個數據持久化操作的Demo代碼,都存儲在GitHub中
其中文件操作的內容,在RACFileManager
類中