IOS應用程序只能讀取在此應用程序中創建的文件系統中的文件,而不能在其他任何地方訪問它們。這個區域叫做沙箱,所有非代碼文件都要保存在這裏,比如圖片、圖標、聲音、圖像、屬性列表、文本文件等。
1.1,每個應用都有自己的存儲空間。
1.2.應用程序不能翻越自己的墻來訪問其他存儲空間的內容。
1.3,應用請求的數據必須通過權限檢查,不符合條件的,不予發布。
從這張圖我們只能理解為沙盒表面上是壹個安全系統,應用的所有操作都必須通過這個系統進行,其核心內容是:沙盒對應用進行各種操作的權限。
2.打開模擬器沙盒目錄。
我們來看看模擬器的沙盒文件夾在mac電腦上的什麽位置。
這些文件都在個人用戶名文件夾下的隱藏文件夾中。中文名是資源庫,英文名是Library。
這裏有壹個簡單的方法來找到這個文件夾:點擊->在Finder上。轉到-& gt;轉到文件夾
進入模擬器後,包含了每個應用的沙箱。
進入壹個應用,如下圖,是壹個沙盒。
下面是沙箱的目錄結構:
默認情況下,每個沙箱包含三個文件夾:Documents、Library和tmp以及壹個應用程序文件(也是壹個文件)。由於應用程序的沙箱機制,應用程序只能讀寫幾個目錄中的文件。
文檔:蘋果建議將程序中創建或瀏覽的文件數據保存在該目錄下,這些數據將包含在iTunes備份和恢復中。
庫:存儲程序的默認設置或其他狀態信息;
庫/緩存:存儲緩存文件。iTunes不會備份此目錄,當應用程序退出時,此目錄中的文件也不會被刪除。
Tmp:提供壹個即時創建臨時文件的地方。
與iPhone同步時,ITunes會備份所有文稿和資料庫文件。
當iPhone重啟後,所有的tmp文件都將被丟棄。
註意:這裏很容易混淆bundle。下面根據我自己的理解來解釋壹下兩者的區別:
Bundle:當壹個iOS應用生成後,Xcode將其捆綁成壹個包。包是文件系統中的壹個目錄,它將相關的資源集中在壹個地方。iOS應用程序包包含其可執行文件和支持資源文件(如應用程序圖標、圖像文件和本地化內容)。
包是壹個具有標準化層次結構的目錄,它保存可執行代碼和該代碼使用的資源。
因此,您可以將整個應用程序視為壹個包。
沙盒的概念與bundle無關,它只是意味著程序資源與外界隔離。
讓我們通過壹個簡單的例子來解釋bundle和sandbox。
//新創建的plist文件在應用程序中,可以通過bundle訪問。
ns string * plist path =[[ns bundle main bundle]path for resource:@ " my plist " of type:@ " plist "];
NSMutableArray * array =[NSMutableArray arraywithcontentsofile:plist path];
//向數組中添加新項。
[array add object:@ " 3 "];
//寫回plist文件。
BOOL value =[array write tofile:plist path atomically:YES];
如果(值){
NSMutableArray * new array =[NSMutableArray arraywithcontentsofile:plist path];
NSLog(@ "新數組= %@ ",new array);
}
/*輸出:
新數組=(
0,
1,
2,
三
)
*/
//獲取沙箱中文檔的路徑
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
ns string * documents directory =[paths objectAtIndex:0];
ns string * new path =[documents directory stringByAppendingPathComponent:@ " data . plist "];
//將數組寫入沙箱的文檔中的data.plist文件。
[array write to file:new path atomically:YES];
NSMutableArray * arr =[[NSMutableArray alloc]initwithcontentsofile:new path];
NSLog(@"array in data.plist = %@ ",arr);
/*輸出:
data.plist =(
0,
1,
2,
三
)
*/
描述:我們首先在項目中創建壹個新的plist文件(根項的類型是array)並添加三個元素。因為新創建的plist文件在應用程序中,所以我們可以通過bundle獲取plist文件,讀取數組,添加壹個數據元素,並將其寫回到plist文件中。然後我們獲取沙盒文檔的路徑,然後將這個文件寫入沙盒中的data.plist文件(如果不存在,會自動新建壹個),然後從data.plist中讀取這個數組。
關於新創建的MyPlist.plist文件,我們在文件的數組中添加了壹個新元素,但是當我們在xcode中查看這個MyPlist.plist文件時,發現新添加的數組元素並沒有顯示出來,但是在沙箱中查看時可以看到。這個估計是xoode本身的問題。
我們還可以在沙盒中查看文檔中的data.plist文件。如下圖所示:
3.獲取沙盒目錄:
//1,獲取程序的主目錄。
ns string * home directory = nshome directory();
NSLog(@“路徑:%@”,home directory);
//路徑:/Users/IOs/Library/Application Support/iPhone Simulator/6.1/Applications/BF 38 c9e 3-1A4A-4929-b5 F2-3e 46 e 41cc 671
//2.獲取文檔目錄。
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
ns string * path =[paths objectAtIndex:0];
NSLog(@“路徑:%@”,路徑);
//路徑:/Users/IOs/Library/Application Support/iPhone Simulator/6.1/Applications/BF 38 c9e 3-1A4A-4929-b5 F2-3e 46 e 41cc 671/Documents
//3.獲取緩存目錄。
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);
ns string * path =[paths objectAtIndex:0];
NSLog(@“路徑:%@”,路徑);
//路徑:/Users/IOs/Library/Application Support/iPhone Simulator/6.1/Applications/BF 38 c9e 3-1A4A-4929-b5 F2-3e 46 e 41cc 671/Library/Caches
//4、獲取庫目錄
NSArray * paths = NSSearchPathForDirectoriesInDomains(nslibrary directory,NSUserDomainMask,YES);
ns string * path =[paths objectAtIndex:0];
NSLog(@“路徑:%@”,路徑);
//路徑:/Users/IOs/Library/Application Support/iPhone Simulator/6.1/Applications/BF 38 c9e 3-1A4A-4929-b5 F2-3e 46 e 41cc 671/Library
//5.獲取tmp目錄。
ns string * tmpDir = NSTemporaryDirectory();
NSLog(@ "路徑:%@ ",tmpDir);
//路徑:/Users/IOs/Library/Application Support/iPhone Simulator/6.1/Applications/BF 38 c9e 3-1A4A-4929-b5 F2-3e 46 e 41cc 671/tmp/
4.文件操作的NSFileManager
4.1.在文檔中創建壹個文件目錄。
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
ns string * documents directory =[paths objectAtIndex:0];
NSLog(@“documents directory % @”,documents directory);
NSFileManager * file manager =[NSFileManager default manager];
ns string * test directory =[documents directory stringByAppendingPathComponent:@ " test "];
//創建壹個目錄
[file manager createDirectoryAtPath:test directory within intermediated directory:YES attributes:nil error:nil];
4.2.在測試目錄中創建文件。
如果我創建壹個文件呢?然後上面的代碼testPath要用stringByAppendingPathComponent拼接生成文件名,比如Test11.txt,這樣就可以在測試目錄下寫文件了。
TestDirectory是上面代碼生成的路徑。哦,別忘了。我在測試文件夾裏寫了三個文件,test11.txt,test22.txt,text.33.txt,東西都寫好了,寫String。
實現代碼如下:
ns string * testpath 1 =[test directory stringByAppendingPathComponent:@ " test 1 . txt "];
ns string * test path 2 =[test directory stringByAppendingPathComponent:@ " test 2 . txt "];
ns string * test path 3 =[test directory stringByAppendingPathComponent:@ " test 3 . txt "];
NSString *string = @ "寫內容,寫字符串";
[file manager createFileAtPath:testpath 1內容:[string data using encoding:nsu TF 8 string encoding]屬性:nil];
[file manager createFileAtPath:testpath 2內容:[string data using encoding:nsu TF 8 string encoding]屬性:nil];
[file manager createFileAtPath:testpath 3內容:[string data using encoding:nsu TF 8 string encoding]屬性:nil];
4.3獲取目錄列中的所有文件名
有兩種獲取方式:subpathsOfDirectoryAtPath和subpathsAtPath。
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
ns string * documents directory =[paths objectAtIndex:0];
NSLog(@“documents directory % @”,documents directory);
NSFileManager * file manager =[NSFileManager default manager];
ns string * my directory =[documents directory stringByAppendingPathComponent:@ " test "];
//方法1
NSArray * file =[file manage subpathsOfDirectoryAtPath:my directory error:nil];
NSLog(@“% @”,文件);
//方法2
NSArray * files =[file manage subpath sat path:my directory];
NSLog(@“% @”,文件);
獲取剛才測試目錄中的所有文件名:
兩種方法都是輸出。
(
" test1.txt ",
" test2.txt ",
" test3.txt "
)
4.4.fileManager使用當前目錄進行操作。
//創建文件管理器
NSFileManager * file manager =[NSFileManager default manager];
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
ns string * documents directory =[paths objectAtIndex:0];
//切換到要操作的目錄。
[file manager change current directory path:[documents directory stringByExpandingTildeInPath]];
//創建文件fileName文件名,contents文件內容,如果壹開始沒有內容,可以設置為nil的屬性,attributes file,initially nil。
ns string * fileName = @ " testfilensfilemanager . txt ";
NSArray * array =[[NSArray alloc]initWithObjects:@ " hello world " ,@ " hello world 1 " ,@ " hello world 2 ",nil];
//下面是將數組類型轉換為NSData類型。
NSMutableData * data =[[NSMutableData alloc]init];
for(int I = 0;我& lt[數組計數];++i ){
ns string * str =[array objectAtIndex:I];
ns data * temp =[str data using encoding:nsu TF 8 string encoding];
[data appendData:temp];
}
//註意,contents參數的類型是NSData。
[文件管理器創建文件路徑:文件名內容:數據屬性:空];
4.5刪除文件
然後上面的代碼就可以刪除新創建的testFileNSFileManager.txt文件了!
[文件管理器removeItemAtPath:文件名錯誤:nil];
4.6讀寫混合數據請參考原文最後壹部分。