-
iOS沙盒機制:
iOS應用程序隻能在為該改程序創建的文件系統中讀取文件,不可以去其它地方訪問,此區域被成為沙盒,所以所有的非代碼文件都要保存在此,例如圖像,圖標,聲音,映像,屬性列表,文本文件等。
1、每個應用程序都有自己的存儲空間
2、應用程序不能翻過自己的圍墻去訪問別的存儲空間的內容
3、應用程序請求的數據都要通過權限檢測,假如不符合條件的話,不會被放行。
通過這張圖隻能從表層上理解sandbox是一種安全體系,應用程序的所有操作都要通過這個體系來執行,其中核心內容是:sandbox對應用程序執行各種操作的權限限制。
-
打開沙盒目錄
1、模擬器沙盒目錄
2、目錄結構
默認情況下,每個沙盒含有3個文件夾:Documents, Library 和 tmp。因為應用的沙盒機制,應用隻能在幾個目錄下讀寫文件
Documents:蘋果建議將程序中建立的或在程序中瀏覽到的文件數據保存在該目錄下,iTunes備份和恢復的時候會包括此目錄
Library:存儲程序的默認設置或其它狀態信息;
Library/Caches:存放緩存文件,iTunes不會備份此目錄,此目錄下文件不會在應用退出刪除
tmp:提供一個即時創建臨時文件的地方。
iTunes在與iPhone同步時,備份所有的Documents和Library文件。
iPhone在重啟時,會丟棄所有的tmp文件。
真機可以通過同步助手打開,如下圖:
-
獲取沙盒的目錄
NSString *homeDirectory = NSHomeDirectory(); NSLog(@"path:%@", homeDirectory);
結果:
模擬器目錄:/Users/tingxuan.qhm/Library/ApplicationSupport/iPhoneSimulator/5.1/ Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2
真機目錄:/var/mobile/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2
可見,真機上的目錄是/var/mobile/Applications/這個目錄下的,和模擬器不一樣。這個是Home目錄,其他的子目錄和模擬器一樣。
獲取Cache目錄:
NSArray*paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES); NSString *path = [paths objectAtIndex:0];NSLog(@”%@”, path);
獲取documents目錄:
NSArray*paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);NSString *path = [paths objectAtIndex:0];NSLog(@”path:%@”, path);
獲取Libarary目錄:
NSArray*paths =NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask, YES);NSString *path = [paths objectAtIndex:0];NSLog(@”%@”, path);
獲取tmp目錄:
NSString*tmpDir = NSTemporaryDirectory(); NSLog(@”%@”, tmpDir);
NSFileManager創建目錄、文件
創建文件:
NSString*rootPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
NSString*plistPath = [rootPathstringByAppendingPathComponent:@”hhk.plist”];
NSFileManager*fileManager = [NSFileManagerdefaultManager];
if(![fileManager fileExistsAtPath:plistPath]) {
[fileManagercreateFileAtPath:plistPathcontents:nilattributes:[NSDictionarydictionary]];//創建一個dictionary文件
}
寫入文件:
NSMutableDictionary *dictionary= [NSMutableDictionary dictionary];
[mutableDictionarywriteToFile:plistPath atomically:YES]
讀取文件:
NSMutableDictionary *dictionary= [NSDictionarydictionaryWithContentsOfFile:plistPath];
創建目錄:
NSArray*paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *documentsDirectory =[pathsobjectAtIndex:0]; NSLog(@”documentsDirectory%@”,documentsDirectory); NSFileManager *fileManager = [NSFileManagerdefaultManager]; NSString*testDirectory
=[documentsDirectorystringByAppendingPathComponent:@”test”]; // 創建目錄
[fileManagercreateDirectoryAtPath:testDirectorywithIntermediateDirectories:YESattributes:nil error:nil];
啟動程序後,創建的目錄如下:
在test目錄下創建文件
創建文件怎麼辦呢?接著上面的代碼 testPath 要用stringByAppendingPathComponent拼接上你要生成的文件名,比如test00.txt。這樣才能在test下寫入文件。testDirectory是上面代碼生成的路徑哦,不要忘瞭。我往test文件夾裡寫入三個文件,test00.txt ,test22.txt,text.33.txt。內容都是寫入內容,write String。實現代碼如下:
NSString *testPath = [testDirectory stringByAppendingPathComponent:@”test00.txt”]; NSString *testPath2 = [testDirectory stringByAppendingPathComponent:@”test22.txt”]; NSString *testPath3 = [testDirectory stringByAppendingPathComponent:@”test33.txt”]; |
獲取目錄下的所有文件:
兩種方法獲取:subpathsOfDirectoryAtPath 和 subpathsAtPath
NSArray*paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString*documentsDirectory= [pathsobjectAtIndex:0]; NSLog(@”documentsDirectory%@”,documentsDirectory); NSFileManager *fileManage
=[NSFileManagerdefaultManager]; NSString *myDirectory =[documentsDirectorystringByAppendingPathComponent:@”test”]; NSArray *file = [fileManagesubpathsOfDirectoryAtPath: myDirectoryerror:nil]; NSLog(@”%@”,file); NSArray *files= [fileManagesubpathsAtPath:
myDirectory]; NSLog(@”%@”,files);
fileManager使用操作當前目錄
//創建文件管理器
NSFileManager*fileManager = [NSFileManager defaultManager];
NSArray*paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*documentsDirectory = [pathsobjectAtIndex:0];
//更改到待操作的目錄下
[fileManagerchangeCurrentDirectoryPath:[documentsDirectorystringByExpandingTildeInPath]];
//創建文件fileName文件名稱,contents文件的內容,如果開始沒有內容可以設置為nil,attributes文件的屬性,初始為nil
NSString *fileName=@”testFileNSFileManager.txt”;
NSArray *array= [[NSArray alloc] initWithObjects:@”helloworld”,@”helloworld1″, @”hello world2″,nil];
[fileManager createFileAtPath:fileNamecontents:array attributes:nil];
這樣就創建瞭testFileNSFileManager.txt並把三個hello world寫入文件瞭
changeCurrentDirectoryPath目錄更改到當前操作目錄時,做文件讀寫就很方便瞭,不用加上全路徑
刪除文件:
[fileManagerremoveItemAtPath:fileNameerror:nil];
混合數據的讀寫:
用NSMutableData創建混合數據,然後寫到文件裡。並按數據的類型把數據讀出來
寫入數據:
NSString* fileName=@”testFileNSFileManager.txt”;
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentsDirectory =[pathsobjectAtIndex:0]; //獲取文件路徑
NSString *path =[documentsDirectorystringByAppendingPathComponent:fileName]; //待寫入的數據
NSString *temp =@”nihao 世界”;
int dataInt =1234;
float dataFloat = 3.14f;
//創建數據緩沖
NSMutableData *writer= [[NSMutableData alloc] init];
//將字符串添加到緩沖中
[writerappendData:[tempdataUsingEncoding:NSUTF8StringEncoding]];
//將其他數據添加到緩沖中
[writer appendBytes:&dataIntlength:sizeof(dataInt)];
[writerappendBytes:&dataFloatlength:sizeof(dataFloat)];
//將緩沖的數據寫入到文件中
[writer writeToFile:pathatomically:YES];
查看寫入的結果:
看到後面的是亂碼,那是中文被轉成瞭NSData後,還有int float的二進制
讀取剛才寫入的數據:
//讀取數據:
intintData; float floatData =0.0;
NSString *stringData;
NSData *reader =[NSDatadataWithContentsOfFile:path];
stringData = [[NSStringalloc] initWithData:[readersubdataWithRange:NSMakeRange(0, [templength])]
encoding:NSUTF8StringEncoding];
[readergetBytes:&intData range:NSMakeRange([templength],sizeof(intData))];
[readergetBytes:&floatData range:NSMakeRange([temp length] +sizeof(intData),sizeof(floatData))];
NSLog(@”stringData:%@intData:%d floatData:%f”, stringData,intData, floatData);