iOS沙盒机制文件操作及bug记录

沙盒机制

每个沙盒有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

就可以正常合成了



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值