IOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容。所有的非代码文件都保存在这个地方,比如图片、声音、属性列表和文本文件等。
每个应用程序的沙盒分为三个部分。分别是Documents(文件文档) Library (资源)其中Library中又分为Caches(缓存)和Preferences(用户信息)tmp(临时文件)。
下面我们快来说说这几个文件都是干什么用的。Doucments是程序中创建的或在程序中浏览到的文件数据保存在该目录下。例如用户在使用该软件是下载的一些文件图片视频和音频文件都存放在该目录下,Tunes备份和恢复的时候会包括此目录。Cashes存放缓存文件,比如浏览一些网站和观看视频和播放音乐都会生成缓存文件都会存放在这里,iTunes不会备份此目录。Preferences 保存用户的一些用户设置信息,是用户设置的一些信息。tmp存放临时文件。当我们下载文件时会临时生成一个文件叫做临时文件,该临时文件就存放在这个文件夹里。下图就是一个应用程序的沙盒文件:
屏幕快照 2016-08-14 下午7.28.49.png
下面我们介绍一下怎么用代码来获取沙盒路径
FOUNDATION_EXPORT NSString *NSHomeDirectory(void);
FOUNDATION_EXPORT NSString *NSTemporaryDirectory(void);
这两个都是系统提供快捷获取到对应目录的 C 函数。分别是获取应用程序的Docunments目录和tmp目录。
除了这个系统提供了获取目录的文件夹的方法。
FOUNDATION_EXPORT NSArray<NSString *> *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);
这个方法有三个参数。
第一个参数是要访问的目录名。是一个枚举。可以点进去看看都有哪些值。例 NSDocumentDirectory 获取documents的路径。
参数2:在用户作用与下搜索 NSUserDomainMask
参数3: yes or no yes代表绝对路径(基本上都用绝对), no代表相对路径。(应为iOS的沙盒路径是不断变化得)。
返回的是一个数组。
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSLog(@"%@", [pathArray firstObject]);
通过这两行代码我们就能访问一个应用程序的Documents的文件目录。
二, 文件的读写
<1> 字符串的读写
// 1> 将文字写入本地
NSString *helloString = @"hello, I/O File";
// 一般拼接路径时, 使用 stringByAppendingPathComponent
NSString *writePath = [[pathArray firstObject] stringByAppendingString:@"/hello.txt"];
NSString *writePath1 = [[pathArray firstObject] stringByAppendingPathComponent:@"hello.txt"];
NSError *error = nil;
BOOL isSuccess = [helloString writeToFile:writePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (error) {
NSLog(@"存储失败");
} else {
NSLog(@"恭喜存储成功!");
}
//2 》 读取对应得文字
NSError *readaError = nil;
NSString *readString = [NSString stringWithContentsOfFile:writePath encoding:NSUTF8StringEncoding error:&readaError];
NSLog(@"%@", readString);
<2> 数组的读写
// 3> 将数组 写入本地文件
NSArray *array = @[@"韩旭",@"王煌",@"报名里",@"国宝"];
NSString *arrayPath = [[pathArray firstObject] stringByAppendingPathComponent:@"name.plist"];
BOOL isArrayWriteSuccess = [array writeToFile:arrayPath atomically:YES];
if (isArrayWriteSuccess) {
NSLog(@"恭喜存储成功!");
} else {
NSLog(@"存储失败");
}
//4> 将数组读入
NSArray *nameArray = [NSArray arrayWithContentsOfFile:arrayPath];
NSLog(@"%@", nameArray);
<3> 字典的读写
//5> 字典 写入本地
NSDictionary *nameDic = @{@"name":@"hello"};
NSString *dictionaryPath = [[pathArray firstObject] stringByAppendingPathComponent:@"nameDic.plist"];
BOOL isDicWriteSuccess = [nameDic writeToFile:dictionaryPath atomically:YES];
if (isDicWriteSuccess) {
NSLog(@"恭喜存储成功!");
} else {
NSLog(@"存储失败");
}
//6》 将字典 读入
NSDictionary *nameDictionary = [NSDictionary dictionaryWithContentsOfFile:dictionaryPath];
NSLog(@"%@", nameDictionary);
<4> data数据的读写
// 7》 将Data 类型写入本地
UIImage *image = [UIImage imageNamed:@"welcome_2"];
NSData *imageData = UIImageJPEGRepresentation(image, 1);
UIImagePNGRepresentation(image);
NSLog(@"%@", imageData);
NSString *dataPath = [[pathArray firstObject] stringByAppendingPathComponent:@"imageData"];
BOOL isimageDataWriteSuccess = [imageData writeToFile:dataPath atomically:YES];
if (isimageDataWriteSuccess) {
NSLog(@"恭喜存储成功!");
} else {
NSLog(@"存储失败");
}
//8> NSData 类型 读入
NSData *imageNewData = [NSData dataWithContentsOfFile:dataPath];
UIImage *fileImage =[UIImage imageWithData:imageNewData];
网友评论