在iOS平臺上,每個應用程序都有存儲照片、聲音文件、屬性列表等,我們稱之為沙盒,在沙盒中應用程序可以自己讀寫文件,但只能在自己的沙盒中讀寫,下面是武林技術頻道小編為大家舉例詳解iOS開發過程中的沙盒機制。
iOS沙盒機制
?iOS應用程序只能在為該改程序創建的文件系統中讀取文件,不可以去其它地方訪問,此區域被成為沙盒,所以所有的非代碼文件都要保存在此,例如圖像,圖標,聲音,映像,屬性列表,文本文件等。
- 每個應用程序都有自己的存儲空間
- 應用程序不能翻過自己的圍墻去訪問別的存儲空間的內容
打開模擬器沙盒目錄
方法1、可以設置顯示隱藏文件,然后在Finder下直接打開。設置查看隱藏文件的方法如下:打開終端,輸入命名
顯示Mac隱藏文件的命令:
?
復制代碼 代碼如下:
defaults write com.apple.finder AppleShowAllFiles -bool true
?
?
隱藏Mac隱藏文件的命令:
復制代碼 代碼如下:
defaults write com.apple.finder AppleShowAllFiles -bool false
?
現在能看到資源庫文件夾了。

打開資源庫后找到/Application Support/iPhone Simulator/文件夾。這里面就是模擬器的各個程序的沙盒目錄了。

方法2、這種方法更方便,在Finder上點->前往? 然后按住"option"鍵,就會出現"資源庫",其他同上
?
目錄結構
默認情況下,每個沙盒含有3個文件夾:Documents, Library 和 tmp。因為應用的沙盒機制,應用只能在幾個目錄下讀寫文件
Documents:蘋果建議將程序中建立的或在程序中瀏覽到的文件數據保存在該目錄下,iTunes備份和恢復的時候會包括此目錄
Library:存儲程序的默認設置或其它狀態信息;
Library/Caches:存放緩存文件,iTunes不會備份此目錄,此目錄下文件不會在應用退出刪除
tmp:提供一個即時創建臨時文件的地方。
iTunes在與iPhone同步時,備份所有的Documents和Library文件。
iPhone在重啟時,會丟棄所有的tmp文件。
這是上面提到的三個目錄 :Documents、Library、 tmp

幾個常用的代碼示例:
1、獲取程序的Home目錄?
復制代碼 代碼如下:
NSString *homeDirectory = NSHomeDirectory();???
NSLog(@"path:%@", homeDirectory);
??
?
2、獲取document目錄?
復制代碼 代碼如下:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);???
NSString *path = [paths objectAtIndex:0];???
NSLog(@"path:%@", path);?
??
?
3、獲取Cache目錄?
復制代碼 代碼如下:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);???
NSString *path = [paths objectAtIndex:0];???
NSLog(@"%@", path);???
?
4、獲取Library目錄?
復制代碼 代碼如下:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);???
NSString *path = [paths objectAtIndex:0];???
NSLog(@"%@", path);?
?
?
5、獲取Tmp目錄?
復制代碼 代碼如下:
NSString *tmpDir = NSTemporaryDirectory();???
?NSLog(@"%@", tmpDir);??
?
6、寫入文件?
復制代碼 代碼如下:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);???
??? NSString *docDir = [paths objectAtIndex:0];???
??? if (!docDir) {???
??????? NSLog(@"Documents 目錄未找到");???????????
??? }???
??? NSArray *array = [[NSArray alloc] initWithObjects:@"內容",@"content",nil];???
??? NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];???
??? [array writeToFile:filePath atomically:YES];?
?
7、寫入文件?
復制代碼 代碼如下:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);???
??? NSString *docDir = [paths objectAtIndex:0];???
??? NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];???
??? NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath];???
??? NSLog(@"%@", array);?
?
8、判斷一個文件是否存在,傳入全路徑(fileExistsAtPath)
復制代碼 代碼如下:
// 創建文件管理器?
NSFileManager * fileManager = [NSFileManager defaultManager];?
?
NSString * documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];?
NSString * filePath = [documents stringByAppendingPathComponent:@"test"];?
?
??? // 判斷一個文件是否存在,傳入全路徑?
??? if ([fileManager fileExistsAtPath:filePath]) {?
??????? NSLog(@"it is exit");?
??? }?
?
9、在Documents里創建目錄
復制代碼 代碼如下:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);???
?? NSString *documentsDirectory = [paths objectAtIndex:0];???
?? NSLog(@"documentsDirectory%@",documentsDirectory);???
?? NSFileManager *fileManager = [NSFileManager defaultManager];???
?? NSString *testDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];???
?? // 創建目錄??
?? [fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YES attributes:nil error:nil];
?
10、在目錄下創建文件
復制代碼 代碼如下:
NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test00.txt"];???
NSString *testPath2 = [testDirectory stringByAppendingPathComponent:@"test22.txt"];???
NSString *testPath3 = [testDirectory stringByAppendingPathComponent:@"test33.txt"];???
?
?
NSString *string = @"寫入內容,write String";?
[fileManager createFileAtPath:testPath contents:[string? dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];?
[fileManager createFileAtPath:testPath2 contents:[string? dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];?
[fileManager createFileAtPath:testPath3 contents:[string? dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];?
?
11、獲取目錄列里所有文件名
兩種方法獲取:subpathsOfDirectoryAtPath 和subpathsAtPath
復制代碼 代碼如下:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);???
NSString *documentsDirectory = [paths objectAtIndex:0];???
NSLog(@"documentsDirectory%@",documentsDirectory);???
NSFileManager *fileManage = [NSFileManager defaultManager];???
NSString *myDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];???
NSArray *file = [fileManage subpathsOfDirectoryAtPath: myDirectory error:nil];??
NSLog(@"%@",file);???
NSArray *files = [fileManage subpathsAtPath: myDirectory ];??
NSLog(@"%@",files);?
?
12、fileManager使用操作當前目錄
復制代碼 代碼如下:
//創建文件管理器?
??? NSFileManager *fileManager = [NSFileManager defaultManager];?
??? NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);?
??? NSString *documentsDirectory = [paths objectAtIndex:0];?
??? //更改到待操作的目錄下?
??? [fileManager changeCurrentDirectoryPath:[documentsDirectory stringByExpandingTildeInPath]];?
??? //創建文件fileName文件名稱,contents文件的內容,如果開始沒有內容可以設置為nil,attributes文件的屬性,初始為nil?
??? NSString * fileName = @"testFileNSFileManager.txt";?
??? NSArray *array = [[NSArray alloc] initWithObjects:@"hello world",@"hello world1", @"hello world2",nil];?
??? [fileManager createFileAtPath:fileName contents:array attributes:nil];?
13、刪除文件
?
復制代碼 代碼如下:
?
[fileManager removeItemAtPath:fileName error:nil];?
上文是武林技術頻道小編舉例詳解iOS開發過程中的沙盒機制與文件,相信大家都有了一定的了解,如需了解更多的相關資訊,請繼續關注武林技術頻道吧!