iOS应用程序只能在系统为该应用所分配的文件区域下读/写文件,这个文件区域就被称为该应用程序的沙盒。这个文件区域的文件结构如下:
- Documents:除了基于NSUserDefaults的首选项之外,应用程序的数据、文件都保存在该目录下
- Library:基于NSUserDefaults的首选项参数保存在Library/Preferences
- tmp:该目录供应用程序存储临时文件,当iOS执行同步时,iTunes不会备份tmp目录下的文件。
appName.app
:包含了应用程序本身的数据,包括资源文件和可执行文件等。程序启动以后,会根据需要从该目录中动态加载代码或资源到内存
如图所示:
获取主要目录路径的方式:(使用C语言的函数)
NSHomeDirectory()
:获取沙盒目录NSTemporaryDirectory()
:获取tmp目录[[NSBundle mainBundle] bundlePath]
:获取appName.app
目录- 获取Documents目录:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
解释:NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde)
- directory:枚举类型,表明我们要搜索的目录名称,比如这里用NSDocumentDirectory表明我们要搜索的是Documents目录。
- domainMask:指定搜索范围,这里的
NSUserDomainMask
表示搜索的范围限制于当前应用的沙盒目录(iOS一般是这个) - expandTilde:BOOL值,表示是否展开波浪线~。我们知道在iOS中~的全写形式是/User/userName,该值为YES即表示写成全写形式,为NO就表示直接写成“~”
一.使用NSData与NSMutableData
NSData与NSMutableData代表Objective-C的数据缓存区。下面列出NSData的常用方法:
dataWithBytes:length:
或者initWIthBytes:length:
:复制C数组所包含的数据来初始化NSData的数据。其中,如果你想完全复制C数组,length则为数组的长度。getBytes:length:
:将NSData指定长度的数据读入数组writeToFile:atomically:
:将NSData的数据写入文件
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.baidu.com"]];
NSLog(@"length=%ld",[data length]);
char buffer[100];
//将NSData写入数组中
[data getBytes:buffer range:NSMakeRange(103, 100)];
NSLog(@"buffer=%s",buffer);
//将NSData转变为NSString
NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",content);
下面的内容列表是:
- NSFileManager:管理文件和目录(创建、删除、移动、复制)
- NSFileHandle:读取文件目录
- NSURL:读取网络资源
- NSBundle:读取项目内部的资源
二.使用NSFileManager管理文件和目录
- 访问文件属性和内容
- 创建、删除、移动、复制
- 查看目录包含的内容
1.访问文件属性和内容
判断指定文件名对应的文件是否存在:
NSString *home = NSHomeDirectory();//获取沙盒家目录
NSString *path = [NSString stringWithFormat:@"%@/string.js",home];
NSFileManager *fm = [NSFileManager defaultManager];
NSLog(@"%d",[fm fileExistsAtPath:path]);
获取指定文件名对应文件的内容:
NSString *home = NSHomeDirectory();
NSString *path = [NSString stringWithFormat:@"%@/string.js",home];
NSFileManager *fm = [NSFileManager defaultManager];
NSData *data = [fm contentsAtPath:path];
NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"content=%@",content);
2.创建、删除、移动、复制
NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSFileManager *fm = [NSFileManager defaultManager];
//创建目录(withIntermediateDirectories为YES,表示父目录如果不存,就创建父目录)
[fm createDirectoryAtPath:[NSString stringWithFormat:@"%@/PDF",document] withIntermediateDirectories:YES attributes:nil error:nil];
//创建一份文件(conent类型为NSData)
NSString *content = @"Hello,World";
[fm createFileAtPath:[NSString stringWithFormat:@"%@/info.pdf",document] contents:[content dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
3.查看目录包含的内容
NSString *home =NSHomeDirectory();
NSFileManager *fm = [NSFileManager defaultManager];
//获取指定目录下的所有文件和文件夹(不会进行递归枚举)
NSArray *array1 = [fm contentsOfDirectoryAtPath:home error:nil];
NSLog(@"array1=%@",array1);
//递归获取指定目录下的所有目录及其子目录
NSArray *array2 = [fm subpathsOfDirectoryAtPath:home error:nil];
NSLog(@"array2=%@",array2);
三.使用NSPathUtilities.h管理路径
NSPathUtilities.h包含了对NSString类的扩展,为NSString类新增了专门用于操作路径的方法。
NSString *home = NSTemporaryDirectory();
//在home路径后追加一个路径
NSString *path = [home stringByAppendingPathComponent:@"abc.m"];
//获取路径的最后部分
NSString *last =[path lastPathComponent];
//获取路径的最后部分的扩展名
NSString *extension =[path pathExtension];
四.使用NSFileHandle处理文件IO
使用readDataOfLength:length:
读取该文件中length字节的数据
NSString *home = NSHomeDirectory();
NSFileHandle *fh = [NSFileHandle fileHandleForReadingAtPath:[NSString stringWithFormat:@"%@/string.js",home]];
NSData *data;
while ([(data = [fh readDataOfLength:512]) length] > 0) {
NSLog(@"%ld",[data length]);
NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",content);
}
[fh closeFile];
使用writeData:data:
:将指定数据data输入到该文件中,注意:NSFileHandle
并没有提供创建文件的功能。
NSString *home = NSHomeDirectory();
NSFileHandle *fh = [NSFileHandle fileHandleForWritingAtPath:[NSString stringWithFormat:@"%@/new.js",home]];
if (!fh) {
NSFileManager *fm = [NSFileManager defaultManager];
[fm createFileAtPath:[NSString stringWithFormat:@"%@/new.js",home] contents:nil attributes:nil];
NSLog(@"new");
fh = [NSFileHandle fileHandleForWritingAtPath:[NSString stringWithFormat:@"%@/new.js",home]];
}
NSString *content = @"new Add";
[fh writeData:[content dataUsingEncoding:NSUTF8StringEncoding]];
[fh closeFile];
五.使用NSBundle处理项目相关资源
在iOS应用中添加资源:把文件拖到Xcode左边的项目导航面板中。当应用自包含这些资源文件后,可以使用NSBundle来访问资源文件。
//string.js必须要在Xcode左边的面板中
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"string" ofType:@"js"];
NSString *content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@",content);