1、沙盒机制介绍
iOS中的沙盒机制是一种安全体系。每个iOS程序都有一个独立的文件系统(存储空间),而且只能在对应的文件系统中进行操作,此区域被称为沙盒。所有的非代码文件都要保存在此,例如属性文件plist、文本文件、图像、图标、媒体资源等。
2、沙盒目录结构
/AppName.app 应用程序的程序包目录。由于应用程序必须经过签名,所以不能在运行时对这个目录中的内容进行修改,否则会导致应用程序无法启动。
/Documents/ 保存应用程序的重要数据文件和用户数据文件等。iTunes 同步时会备份该目录。
/Library/Caches 保存应用程序使用时产生的支持文件和缓存文件,还有日志文件最好也放在这个目录。iTunes 同步时不会备份该目录。
/Library/Preferences 保存应用程序的偏好设置文件(使用 NSUserDefaults 类设置时创建,不应该手动创建)。
/tmp/ 保存应用运行时所需要的临时数据,iphone 重启时,会清除该目录下所有文件。
3、获取沙盒目录
/*获取程序的Home目录*/
NSString *homeDirectory = NSHomeDirectory();
NSLog(@"path:%@", homeDirectory);
/*获取Document目录*/
NSArray*documentArr =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
/*获取Caches目录*/
NSArray*cachesArr =NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);
NSString*caches = [cachesArrobjectAtIndex:0];
NSLog(@"\npath-Caches%@", caches);
/* Library目录*/
NSArray*libraryArr =NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
NSString*library = [libraryArrobjectAtIndex:0];
NSLog(@"\npath-Library%@", library);
/* tem目录*/
NSString*tmpDir =NSTemporaryDirectory();
NSLog(@"%@", tmpDir);
NSString*document = [documentArrobjectAtIndex:0];
NSLog(@"\npath-Document:%@", document);
4、文件操作
/*写入文件*/
NSArray*paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*docDir = [pathsobjectAtIndex:0];
if(!docDir) {
NSLog(@"Documents目录未找到");
}
NSArray*array =@[@"姓名",@"性别"];
NSString*filePath = [docDirstringByAppendingPathComponent:@"arrayFile.txt"];
NSDictionary*dict =@{@"姓名":@"jcf",@"性别":@"男"};
NSString*dictPath = [docDirstringByAppendingPathComponent:@"dictFile.json"];
[arraywriteToFile:filePathatomically:YES];
[dictwriteToFile:dictPathatomically:YES];
/*读取文件*/
NSArray*pathss =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*docDirs = [pathssobjectAtIndex:0];
NSString*arrayPaths = [docDirsstringByAppendingPathComponent:@"arrayFile.txt"];
NSArray*arrays = [[NSArrayalloc]initWithContentsOfFile:arrayPaths];
NSString*dictPaths = [docDirsstringByAppendingPathComponent:@"dictFile.json"];
NSDictionary*dicts = [NSDictionarydictionaryWithContentsOfFile:dictPaths];
NSLog(@"array:%@ *** dicts:%@", arrays,dicts);
/*创建文件*/ 在Document下创建文件
NSArray*pathsss =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*documentsDirectory = [pathsssobjectAtIndex:0];
NSFileManager*fileManager = [NSFileManagerdefaultManager];
NSString*testDirectory = [documentsDirectorystringByAppendingPathComponent:@"test"];
//创建目录
[fileManagercreateDirectoryAtPath:testDirectorywithIntermediateDirectories:YESattributes:nilerror:nil];
/*在test目录写入文件*/
NSString*testPath = [testDirectorystringByAppendingPathComponent:@"mytest.txt"];
NSString*string =@"IOS开发hello world";
[fileManagercreateFileAtPath:testPathcontents:[stringdataUsingEncoding:NSUTF8StringEncoding]attributes:nil];
NSString*testPath1 = [testDirectorystringByAppendingPathComponent:@"mytest1.json"];
NSDictionary*dict1 =@{@"姓名":@"jcf",@"性别":@"男"};
NSData*data1 = [NSJSONSerializationdataWithJSONObject:dict1options:NSJSONWritingPrettyPrintederror:nil];
[fileManagercreateFileAtPath:testPath1contents:data1attributes:nil];
*获取test目录所有文件名*/
//两种方法获取:subpathsOfDirectoryAtPath和subpathsAtPath
NSArray*path =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*documents = [pathobjectAtIndex:0];
NSFileManager*fileManage = [NSFileManagerdefaultManager];
NSString*myDirectory = [documentsstringByAppendingPathComponent:@"test"];
/* subpathsOfDirectoryAtPath */
NSArray*file = [fileManagesubpathsOfDirectoryAtPath: myDirectoryerror:nil];
NSLog(@"%@",file);
/* subpathsAtPath */
NSArray*files = [fileManagesubpathsAtPath: myDirectory ];
NSLog(@"%@",files);
/*使用文件管理器:fileManager */
//创建文件管理器
NSFileManager*manager = [NSFileManagerdefaultManager];
NSArray*path_manager =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*documents_manager = [path_managerobjectAtIndex:0];
//指定待操作文件
[managerchangeCurrentDirectoryPath:documents_manager ];//将指定的扩展名添加到现有路径的最后一个组成部分上
NSString* fileTxt =@"testManager.txt";
NSArray*fileArray = [[NSArrayalloc]initWithObjects:@"one",@"two",@"three",nil];
NSData*data = [NSJSONSerializationdataWithJSONObject:fileArrayoptions:NSJSONWritingPrettyPrintederror:nil];
[fileManagercreateFileAtPath:fileTxtcontents:dataattributes:nil];
/*删除文件*/
[managerremoveItemAtPath:fileTxterror:nil];
/*混合数据读写操作*/
//用NSMutableData创建混合数据,然后写到文件里。并按数据的类型把数据读出来
NSString* fileName =@"testFileNSFileManager.txt";
NSArray*path_file =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*document_file = [path_fileobjectAtIndex:0];
//获取文件路径
NSString*pathStr = [document_filestringByAppendingPathComponent:fileName];
//待写入的数据
NSString*temp =@"nihao hello";
intdataInt =1234;
floatdataFloat =3.14f;
//创建数据缓冲
NSMutableData*writer = [[NSMutableDataalloc]init];
//将字符串添加到缓冲中
[writerappendData:[tempdataUsingEncoding:NSUTF8StringEncoding]];
//将其他数据添加到缓冲中
[writerappendBytes:&dataIntlength:sizeof(dataInt)];
[writerappendBytes:&dataFloatlength:sizeof(dataFloat)];
//将缓冲的数据写入到文件中
[writerwriteToFile:pathStratomically:YES];
//读取数据:
intintData;
floatfloatData =0.0;
NSString*stringData;
NSData*reader = [NSDatadataWithContentsOfFile:pathStr];
stringData = [[NSStringalloc]initWithData:[readersubdataWithRange:NSMakeRange(0, [templength])]
encoding:NSUTF8StringEncoding];
[reader getBytes:&intData range:NSMakeRange([temp length],sizeof(intData))];
[reader getBytes:&floatData range:NSMakeRange([temp length] +sizeof(intData),sizeof(floatData))];
NSLog(@"stringData:%@ intData:%d floatData:%f", stringData, intData, floatData);
附加:
1.在iOS8之前,我们获取到沙盒中的document、cache、tmp之后,下一次模拟器或真机无论怎样重启,这具体的路径是固定的了。(下面我们以Document为例介绍)
///Users/fanmingyang/Library/Developer/CoreSimulator/Devices/B9F35720-6386-445A-A0DA-0D911BFA64C3/data/Containers/Data/Application/176DA32A-E007-42F5-8716-3BBD80FFAB4F/Library/Documents
比如上面是iOS8之前获取到的document路径,在这之后,只要应用不删除,那么这个document路径就一直是这个
2.在iOS8之后,苹果可能考虑到安全因素,应用每一次重启,沙盒路径都动态的发生了变化。
iOS8中第一次启动时的路径:
///Users/fanmingyang/Library/Developer/CoreSimulator/Devices/B9F35720-6386-445A-A0DA-0D911BFA64C3/data/Containers/Data/Application/D73211C2-497C-4C92-828C-584955C23BCB/Library/Documents
iOS8中第二次启动时的路径:
///Users/fanmingyang/Library/Developer/CoreSimulator/Devices/B9F35720-6386-445A-A0DA-0D911BFA64C3/data/Containers/Data/Application/2B080462-8330-440E-AC26-
B9B15E065110/Library/Documents
3.可见。iOS8之后,每一次重启路径都发生了变化
4.虽然iOS8之后,沙盒的路径发生了变化,但是并不代表你原来沙盒路径中的数据发生了变化;同时,也并不代表路径会越来越多。
比如,我在document中写入了数据own.data后,下一次重启后路径变化了,那我们不禁要问,我们的own.data去哪儿呢?
其实这个不用担心,苹果已经为你做好了.
1>苹果会把你上一个路径中的数据转移到你新的路径中。
2>你上一个路径也会被苹果毫无保留的删除,只保留最新的路径。