iOS 沙盒机制及文件操作
沙盒机制简介
iOS应用程序只能在为该程序创建的文件目录下进行文件的读写操作,不可以去其它地方访问,此文件区域被成为沙盒。
每个iOS应用都有自己的应用沙盒,应用沙盒就是文件系统目录,沙盒对应用程序执行各种操作的规定了区域范围的权限限制 。
特点:
1.每个应用程序的活动范围都限定在自己的沙盒里
2.不能随意跨越自己的沙盒去访问别的应用程序沙盒中的内容
(iOS8已经部分开放访问extension)
3.在访问别人沙盒内的数据时需要访问权限。
概括:
1.是一种安全体系的表现
2.总体来说沙盒就是一种独立、安全、封闭的空间。
3.非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。
打开沙盒目录
模拟器沙盒
方法1、可以设置显示隐藏文件,然后在Finder下直接打开。设置查看隐藏文件的方法如下:打开终端,输入命令
显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
输完单击Enter键,退出终端,重新启动Finder就可以了
重启Finder:鼠标单击窗口左上角的苹果标志-->强制退出-->Finder-->
方法2、这种方法更方便,在Finder上点->前往->前往文件夹,输入/Users/用户名/Library/Developer/CoreSimulator/Devices/EC823725-0694-4879-ADBE-423B7C3DF01F/data/Containers/Data/Application 前往。
沙盒内部文件作用:
Documents:保存应用运行时生成的需要持久化的数据,iTunes会自动备份该目录。
苹果建议将在应用程序中浏览到的文件数据保存在该目录下。
Library:
Caches:
一般存储的是缓存文件,例如图片视频等,此目录下的文件不会再应用程序退出时删除。
*在手机备份的时候,iTunes不会备份该目录。
例如音频,视频等文件存放其中
Preferences:
保存应用程序的所有偏好设置iOS的Settings(设置),我们不应该直接在这里创建文件,
而是需要通过NSUserDefault这个类来访问应用程序的偏好设置。
*iTunes会自动备份该文件目录下的内容。
比如说:是否允许访问图片,是否允许访问地理位置......
tmp:临时文件目录,在程序重新运行的时候,和开机的时候,会清空tmp文件夹。
手机沙盒 目录路径: /var/mobile/Applications
通过代码打开沙盒
1).获取沙盒的Home目录
NSString *homePath = NSHomeDirectory();
2).获取沙盒的Documents目录
@param NSDocumentDirectory 获取Document目录
@param NSUserDomainMask 是在当前沙盒范围内查找
@param YES 展开路径,NO是不展开
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
3).获取Library文件路径
@param NSLibraryDirectory 获取Library目录
@param NSUserDomainMask 在当前的沙盒范围内查找
@param YES 展开路径,NO不展开路径 *
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
4).获取Library/Caches文件目录
@param NSCachesDirectory 获取Library/Caches目录
@param NSUserDomainMask 在当前的沙盒范围内查找
@param YES 展开路径,NO不展开路径 *
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
5).获取Library/Preferences文件目录
Preferences由系统维护,不需要我们手动的获取文件路径进行操作,而是需要借助NSUserDefault来操作,但是我们是可以获取到这个文件的。
@param NSLibraryDirectory 获取Library目录
@param NSUserDomainMask 在当前的沙盒范围内查找
@param YES 展开路径,NO不展开路径 *
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
NSUserDomainMask, YES)firstObject]stringByAppendingPathComponent:@"Preferences"];
6).获取tmp文件路径
NSString *filePath = NSTemporaryDirectory();
向沙盒中读写文件
写入文件
NSArray *array = [NSArray arrayWithObjects:@"write",@"to", @“sandbox”, nil];
[array writeToFile:filePah atomically:YES];
读取文件
NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePah];
iOS NSFileManager 的使用
1.创建目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *newDirectory = [documentsDirectory stringByAppendingPathComponent:@“newDirectory”];
[fileManager createDirectoryAtPath:newDirectory withIntermediateDirectories:YES attributes:nil error:nil];
2.创建文件
//用全路径创建文件
NSString *myStr = @"写入内容,write String";
NSString *filePath = [newDirectory stringByAppendingPathComponent:@“newFIle.txt"];
[FileManager createFileAtPath:filePath contents:[myStr dataUsingEncoding:NSUTF8StringEncoding]
attributes:nil];
//更改到待操作的目录下,再创建文件
[fileManager changeCurrentDirectoryPath:[documentsDirectory stringByExpandingTildeInPath]];
NSString * fileName = @"newFIle.txt";
NSArray *array = [[NSArray alloc] initWithObjects:@"hello world”,nil];
[fileManager createFileAtPath:fileName contents:array attributes:nil];
3.获取指定文件下所有目录及文件(两个都行)
NSArray *files = [fileManage subpathsOfDirectoryAtPath: newDirectory error:nil];
NSArray *files = [fileManage subpathsAtPath: newDirectory ];
4.删除文件
[fileManager removeItemAtPath:@“文件路径” error:nil];
5.写数据
//待写入的数据
NSString *strTemp = @“hello world”;
int intData = 1992;
float floatData = 3.4f;
//创建数据缓冲
NSMutableData *writer = [[NSMutableData alloc] init];
//将字符串添加到缓冲中
[writer appendData:[strTemp dataUsingEncoding:NSUTF8StringEncoding]];
//将其他数据添加到缓冲中
[writer appendBytes:&intData length:sizeof(intData)];
[writer appendBytes:&floatData length:sizeof(floatData)];
//将缓冲的数据写入到文件中
[writer writeToFile:filePath atomically:YES];
6.读数据
int intData;
float floatData = 0.0;
NSString *strData;
NSData *reader = [NSData dataWithContentsOfFile:filePath];
strData = [[NSString alloc] initWithData:[reader subdataWithRange:NSMakeRange(0, [strTemp length])]
encoding:NSUTF8StringEncoding];
[reader getBytes:&intData range:NSMakeRange([strTemp length], sizeof(intData))];
[reader getBytes:&floatData range:NSMakeRange([strTemp length] + sizeof(intData), sizeof(floatData))];