沙盒機制與文件(一)

1、iOS沙盒機制

iOS應用程序只能在為該改程序創建的文件系統中讀取文件,不可以去其它地方訪問,此區域被成為沙盒,所以所有的非代碼文件都要保存在此,例如圖像,圖標,聲音,映像,屬性列表,文本文件等。

1.1、每個應用程序都有自己的存儲空間
1.2、應用程序不能翻過自己的圍墻去訪問別的存儲空間的內容
2、打開模擬器沙盒目錄

方法1、可以設置顯示隱藏文件,然后在Finder下直接打開。設置查看隱藏文件的方法如下:打開終端,輸入命名

顯示Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
隱藏Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
現在能看到資源庫文件夾了。


2016-01-11_569358ad3c2e3.png

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


3625.png

方法2、這種方法更方便,在Finder上點->前往 然后按住"option"鍵,就會出現"資源庫",其他同上
3、目錄結構

默認情況下,每個沙盒含有3個文件夾:Documents, Library 和 tmp。因為應用的沙盒機制,應用只能在幾個目錄下讀寫文件
Documents:蘋果建議將程序中建立的或在程序中瀏覽到的文件數據保存在該目錄下,iTunes備份和恢復的時候會包括此目錄
Library:存儲程序的默認設置或其它狀態信息;
Library/Caches:存放緩存文件,iTunes不會備份此目錄,此目錄下文件不會在應用退出刪除

tmp:提供一個即時創建臨時文件的地方。

iTunes在與iPhone同步時,備份所有的Documents和Library文件。

iPhone在重啟時,會丟棄所有的tmp文件。

這是上面提到的三個目錄 :Documents、Library、 tmp

23.png

<pre>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);
</pre>

0、判斷一個文件是否存在,傳入全路徑(fileExistsAtPath)
<pre>// 創建文件管理器
NSFileManager * fileManager = [NSFileManager defaultManager];

NSString * documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
NSString * filePath = [documents stringByAppendingPathComponent:@"test"];

// 判斷一個文件是否存在,傳入全路徑
if ([fileManager fileExistsAtPath:filePath]) {
    NSLog(@"it is exit");
}</pre>

<pre>1、在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];

2、在目錄下創建文件

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];
3、獲取目錄列里所有文件名

兩種方法獲取: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);
4、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];
5、刪除文件

[fileManager removeItemAtPath:fileName error:nil]; </pre>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1、 沙盒概念基本介紹 iOS 應用程序只能在該 app 的文件系統中讀取。這個默認的 app 文件系統就是我們說...
    Laughingg閱讀 2,768評論 2 10
  • 出于安全考慮,iOS系統的沙盒機制規定每個應用都只能訪問當前沙盒目錄下面的文件(也有例外,比如系統通訊錄能在用戶授...
    隨風飄蕩的小逗逼閱讀 966評論 0 0
  • iOS沙盒機制 沙盒機制 不好意思,我又一次來到了你們的世界,其實我是拒絕的,但是我的無法忍受內心的躁動!額我TM...
    iOSDevVicky閱讀 2,011評論 0 12
  • 出于安全考慮,iOS系統的沙盒機制規定每個應用都只能訪問當前沙盒目錄下面的文件(也有例外,比如系統通訊錄能在用戶授...
    Anticipate_91閱讀 532評論 0 3
  • 前言:突然想學習一下,沙盒,看了那么多博客,我四處的搜集一下總結一下,為了以后方便學習,留存一篇整合的文章。 一、...
    麥穗0615閱讀 12,367評論 5 28