沙盒机制
每个沙盒有myApp.app,Documents, Library 和 tmp四个文件目录
1.myApp.app:是程序包所存放的路径,程序运行的资源从这里读取,整个文件目录是只读的。
2.Documents:用于存放用户数据,默认可读写。
将数据写到Document下
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *path = [paths objectAtIndex:0];
NSString *filePath = [docDir stringByAppendingPathComponent:fileName];
return [data writeToFile:filePath atomically:YES];
读取数据
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *path = [paths objectAtIndex:0];
NSString *filePath = [path stringByAppendingPathComponent:@"testFile.txt"];
NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
3.Library:用于存放程序默认设置
Library /Caches:用于存放缓存数据等可再生的数据,可以删除
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);
输出结果:
path:/Users/username/Library/Application Support/iPhone Simulator/5.1/Applications/BAE34297-A2C6-4DDC-A9DA-7B790B36C7A/Library/Caches
NSSearchPathForDirectoriesInDomains参数
NSCachesDirectory:搜索的文件夹; NSUserDomainMask:搜索的范围;YES:路径不采用波浪线的形式暂开
Library/Preferences:存储应用程序的偏好设置,NSUserDefaluts设置的数据都会保存到该目录下的plist文件
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);
输出结果:
path:/Users/username/Library/Application Support/iPhone Simulator/5.1/Applications/BAE34297-A2C6-4DDC-A9DA-7B790B36C7A/Library
4.temp:保存程序再次启动不再需要的文件
NSString *path = NSTemporaryDirectory();
NSLog(@"%@", path);
输出结果:
path:/var/folders/hj/8sgyk0f555l1z_n95p2b2kp00000gn/T/
iOS沙盒机制
iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。
1.1、每个应用程序都有自己的存储空间
1.2、应用程序不能去访问别的存储空间的内容
1.3、应用程序请求的数据都要通过权限检测
沙盒文件路径的一些操作通过fileManager
1.获取Documents路径:
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *documentPath = [documentPaths objectAtIndex:0];
2.创建文件目录:
NSFileManager* fileManager = [[NSFileManager alloc] init];//文件管理器
BOOL isDirectory;
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *documentPath = [documentPaths objectAtIndex:0];
directory = [documentPath stringByAppendingPathComponent:directory];//拼接文件路径
//如果该目录已存在则返回,不存在则创建目录
if([fileManager fileExistsAtPath:directory isDirectory:&isDirectory] && isDirectory){
return;
}else{
[fileManager createDirectoryAtPath:directory withIntermediateDirectories:YES attributes:nil error:nil];
//其中attributes是对文件目录的一些设置
}
3.删除目录
NSFileManager* fileManager = [[NSFileManager alloc] init];
BOOL isDirectory;
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *documentPath = [documentPaths objectAtIndex:0];
directory = [documentPath stringByAppendingPathComponent:directory];//directory是目录名
if([fileManager fileExistsAtPath:directory isDirectory:&isDirectory] && isDirectory)
{
//删除目录
[fileManager removeItemAtPath:directory error:nil];
}
4.根据文件名删除指定的目录
NSString *extension = @"png";
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSArray *contents = [fileManager contentsOfDirectoryAtPath:documentsDirectory error:NULL];
NSEnumerator *e = [contents objectEnumerator];
NSString *filename;
while ((filename = [e nextObject]))
{
if ([[filename pathExtension] isEqualToString:extension])
{
[fileManager removeItemAtPath:[documentsDirectory stringByAppendingPathComponent:filename] error:NULL];
}
}
在公司项目遇到一个bug,是关于pdf和aip文档的手写文字笔迹合成bug,在模拟器上使用总监C的库合成文档没有问题,但是在真机上运行笔迹无法合成,对比真机和模拟器的不同,想到文件路径的区别。
真机合成的文档是从以下路径读取的
private/var/mobile/Containers/Bundle/Application/46D89A8E-AF43-40BC-96F4-028EE4CC4D79/DJContentsExample.app/鼓楼信息.pdf
而模拟器合成文档的路径是从这个路径读取的
/Users/dianju/Library/Developer/CoreSimulator/Devices/9B06DB30-86CE-42C1-842D-F718C4E40AED/data/Applications/03E2D1D4-47C3-41F7-9F63-FD7C970CF693/DJContentsExample.app/鼓楼信息.pdf
由于demo是从工程的本身的文件中读取出路径,我直接把这个路径下的文件打开,而这个路径下的文件应该是只能读不能写。
解决方法:我根据读取的路径再取出data数据并保存到可读写的文件下
/var/mobile/Containers/Data/Application/D1E83F3B-03C9-43EB-B31C-EF51810E20E1/Documents/pdfTemp Save.pdf
就可以正常合成了