資源連接:
iOS文件沙盒簡介
Note:iOS中的沙盒機制(SandBox)是一種安全體系,它規(guī)定了應用程序只能在為該應用創(chuàng)建的文件夾內讀取文件,不可以訪問其他地方的內容。所有的非代碼文件都保存在這個地方,比如圖片、聲音、屬性列表和文本文件等。
- Sandbox (computer security), a virtual container in which untrusted programs can be safely run
Sandbox (software development), an online environment in which code or content changes can be tested without affecting the original system
每個應用程序都在自己的沙盒內。
不能隨意跨越自己的沙盒去訪問別的應用程序沙盒的內容。
應用程序向外請求或接收數(shù)據(jù)都需要經(jīng)過權限認證(從其他沙盒)。
應用沙盒一般包括以下幾個文件目錄:應用程序包、Documents、Libaray(下面有Caches和Preferences目錄)、tmp。
應用沙盒目錄
-
應用程序包:包含所有的資源文件和可執(zhí)行文件。
Note:路徑,[[NSBundle mainBundle] bundlePath];
-
沙盒路徑
NSHomeDirectory()
-
Documents:保存應用運行時生成的需要持久化的數(shù)據(jù),iTunes會自動備份該目錄。蘋果建議將程序中建立的或在程序中瀏覽到的文件數(shù)據(jù)保存在該目錄下,iTunes備份和恢復的時候會包括此目錄。
NSArray *arrDocumentPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *documentPath=[arrDocumentPaths objectAtIndex:0]; NSLog(@"Documents path: %@",documentPath);
-
tmp:保存應用運行時所需的臨時數(shù)據(jù),使用完畢后再將相應的文件從該目錄刪除。應用沒有運行時,系統(tǒng)也有可能會清除該目錄下的文件,iTunes不會同步該目錄。iphone重啟時,該目錄下的文件會丟失。
NSTemporaryDirectory()
-
Libaray/Caches:存放緩存文件,iTunes不會備份此目錄,此目錄下文件不會在應用退出刪除。一般存放體積比較大,不是特別重要的資源。
//Library目錄 NSArray *libsPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSString *libPath = [libsPath objectAtIndex:0];
NSLog(@"Library目錄:%@",libPath);
NSArray *arrCachesPaths=NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);
NSString *CachesPath=[arrCachesPaths objectAtIndex:0];
NSLog(@"Caches path: %@",CachesPath);
```
- Libaray/Preferences:保存應用的所有偏好設置,iOS的Settings(設置)應用會在該目錄中查找應用的設置信息,iTunes會自動備份該目錄。
用戶偏好設置,plist格式文檔;
系統(tǒng)提供[NSUserDefaults standardUserDefaults]單例類直接操作文檔。
應用程序包和沙盒的路徑區(qū)別
沙盒和應用包.png
工具類
- FileUtils.h
#import <Foundation/Foundation.h>
@interface FileUtils : NSObject
//返回緩存根目錄 "caches"
+(NSString *)getCachesDirectory;
//返回根目錄路徑 "document"
+ (NSString *)getDocumentPath;
//創(chuàng)建文件夾
+(BOOL)creatDir:(NSString*)dirPath;
//刪除文件夾
+(BOOL)deleteDir:(NSString*)dirPath;
//移動文件夾
+(BOOL)moveDir:(NSString*)srcPath to:(NSString*)desPath;
//創(chuàng)建文件
+ (BOOL)creatFile:(NSString*)filePath withData:(NSData*)data;
//讀取文件
+(NSData*)readFile:(NSString *)filePath;
//刪除文件
+(BOOL)deleteFile:(NSString *)filePath;
//返回 文件全路徑
+ (NSString*)getFilePath:(NSString*) fileName;
//在對應文件保存數(shù)據(jù)
+ (BOOL)writeDataToFile:(NSString*)fileName data:(NSData*)data;
//從對應的文件讀取數(shù)據(jù)
+ (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;
}
//創(chuàng)建文件目錄
+(BOOL)creatDir:(NSString*)dirPath
{
if ([[NSFileManager defaultManager] fileExistsAtPath:dirPath])//判斷dirPath路徑文件夾是否已存在,此處dirPath為需要新建的文件夾的絕對路徑
{
return NO;
}
else
{
[[NSFileManager defaultManager] createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil];//創(chuàng)建文件夾
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;
}
}
//創(chuàng)建文件
+ (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