iOS学习之沙盒
1、iOS沙盒
?iOS應用程序只能在為該改程序創建的文件系統中讀取文件,不可以去其它地方訪問,此區域被成為沙盒,所以所有的非代碼文件都要保存在此,例如圖像,圖標,聲音,映像,屬性列表,文本文件等。
?1.1、每個應用程序都有自己的存儲空間
?1.2、應用程序不能翻過自己的圍墻去訪問別的存儲空間的內容
?1.3、應用程序請求的數據都要通過權限檢測,假如不符合條件的話,不會被放行。
2、打開模擬器沙盒目錄
下面看看模擬器的沙盒文件夾在mac電腦上的什么位置。
文件都在個人用戶名文件夾下的一個隱藏文件夾里,中文叫資源庫,他的目錄其實是Library。
2.1 方法1、可以設置顯示隱藏文件,然后在Finder下直接打開。設置查看隱藏文件的方法如下:打開終端,輸入命名
顯示Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
隱藏Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
輸完單擊Enter鍵,退出終端,重新啟動Finder就可以了
重啟Finder:鼠標單擊窗口左上角的蘋果標志-->強制退出-->Finder-->
打開資源庫后找到/Application Support/iPhone Simulator/文件夾。這里面就是模擬器的各個程序的沙盒目錄
2.2 方法2、這種方法更方便,在Finder上點->前往->前往文件夾,輸入/Users/username/Library/Application Support/iPhone Simulator/ ?前往。
username這里寫你的用戶名。
3、目錄結構
- 默認情況下,每個沙盒含有3個文件夾:Documents, Library 和 tmp。因為應用的沙盒機制,應用只能在幾個目錄下讀寫文件
Documents:保存應用運行時生成的需要持久化的數據,iTunes同步設備時會備份該目錄。例如,游戲應用可將游戲存檔保存在該目錄 - tmp:保存應用運行時所需的臨時數據,使用完畢后再將相應的文件從該目錄刪除。應用沒有運行時,系統也可能會清除該目錄下的文件。iTunes同步設備時不會備份該目錄
- Library/Caches:保存應用運行時生成的需要持久化的數據,iTunes同步設備時不會備份該目錄。一般存儲體積大、不需要備份的非重要數據
- Library/Preference:保存應用的所有偏好設置,iOS的Settings(設置)應用會在該目錄中查找應用的設置信息。iTunes同步設備時會備份該目錄
二、獲取主要目錄路徑的方式
1、沙盒目錄
NSLog(@"%@",NSHomeDirectory());?
輸出結果:
/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A?
1.tmp
NSLog(@"%@",NSTemporaryDirectory());??
輸出結果:?
/private/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A/tmp/?
2.Myapp.app
NSLog(@"%@",[[NSBundle?mainBundle]?bundlePath]);??
輸出結果:
/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A/PhoneCall.app??
3.Documents
NSArray?*paths?=?NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,?NSUserDomainMask,?YES);??
NSString?*path?=?[paths?objectAtIndex:0];??
或者寫成: NSString?*path?=?[paths?lastObject];?
//documentDirectory只有一個元素所以取第一個元素根最后一個元素是一樣的。?
NSLog(@"%@",path);??
輸出結果:?
/var/mobile/Applications/326640A7-6E27-4C63-BA5E-7391F203659A/Documents??
?
注:這里用到的NSSearchPathForDirectoriesInDomains方法需要解釋下,其聲明如下:?
FOUNDATION_EXPORT?NSArray?*NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory?directory,?NSSearchPathDomainMask?domainMask,?BOOL?expandTilde);??
該方法用于返回指定范圍內的指定名稱的目錄的路徑集合。有三個參數:
- directory
NSSearchPathDirectory類型的enum值,表明我們要搜索的目錄名稱,比如這里用NSDocumentDirectory表明我們要搜索的是Documents目錄。如果我們將其換成NSCachesDirectory就表示我們搜索的是Library/Caches目錄。
- domainMask
NSSearchPathDomainMask類型的enum值,指定搜索范圍,這里的NSUserDomainMask表示搜索的范圍限制于當前應用的沙盒目錄。還可以寫成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network)等。
- expandTilde
BOOL值,(YES: /User/userName. NO: ~)表示是否展開波浪線~。我們知道在iOS中~的全寫形式是/User/userName,該值為YES即表示寫成全寫形式,為NO就表示直接寫成“~” 。
三、NSFileManager的一些相關操作:
1)創建文件夾:
?NSString *myDirectory = [documentDirectory stringByAppendingPathComponent:@"test"];
???? BOOL ok = [fileManage createDirectoryAtPath:myDirectory withIntermediateDirectories:YES attributes:nil error:&error];
2)取得一個目錄下得所有文件名:(如上面的myDirectory)可用
NSArray *file = [fileManager subpathsOfDirectoryAtPath: myDirectory error:nil];
或
NSArray *files = [fileManager subpathsAtPath: myDirectory ];
或
NSArray *files=[fileManager? contentsOfDirectoryAtPath:documentDirectory error:&error];
3)讀取某個文件:
NSData *data = [fileManger contentsAtPath:myFilePath];//myFilePath是包含完整路徑的文件名
或直接用NSData 的類方法:
NSData *data = [NSData dataWithContentOfPath:myFilePath];
4)保存某個文件:
可以用 NSFileManager的
- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
或 NSData 的
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
- (BOOL)writeToFile:(NSString *)path options:(NSUInteger)writeOptionsMask error:(NSError **)errorPtr;
5)字符串寫入文件:
[str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
[NSString stringWithContentsOfFile...];
6)移動文件:
if ([fileMgr moveItemAtPath:filePath toPath:filePath2 error:&error] != YES)
7)刪除文件:
if ([fileMgr removeItemAtPath:filePath2 error:&error] != YES)
8)判斷是否是文件夾:
BOOL isDir = NO;
[fileManager fileExistsAtPath:path isDirectory:(&isDir)];
?if (isDir) { ...}
9)以下代碼用于獲取本機上的文件資源或圖片
獲取文本:
NSFileManager *fileManager=[NSFileManager defaultManager];
NSData *data=[fileManager contentsAtPath:@"/Developer/Documentation/wxWidgets/docs/lgpl.txt"];
NSString *string=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",string);
獲取圖片:
NSData *myData=[fileManager contentsAtPath:@"/Users/ruby/Desktop/Photo1.jpg"];
UIImage *myImage=[UIImage imageWithData:myData];
imageView.image=myImage;
?
轉載于:https://www.cnblogs.com/bzhong/p/5947167.html
總結
- 上一篇: UVa 10082 - WERTYU 解
- 下一篇: Laplacian matrix 从拉普