- iOS沙盒机制:
iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。
1、每个应用程序都有自己的存储空间
2、应用程序不能翻过自己的围墙去访问别的存储空间的内容
3、应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。
通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容是:sandbox对应用程序执行各种操作的权限限制。
- 打开沙盒目录
1、模拟器沙盒目录
2、目录结构
默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件
Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
Library:存储程序的默认设置或其它状态信息;
Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
tmp:提供一个即时创建临时文件的地方。
iTunes在与iPhone同步时,备份所有的Documents和Library文件。
iPhone在重启时,会丢弃所有的tmp文件。
真机可以通过同步助手打开,如下图:
- 获取沙盒的目录
NSString *homeDirectory = NSHomeDirectory(); NSLog(@"path:%@", homeDirectory);
结果:
模拟器目录:/Users/tingxuan.qhm/Library/ApplicationSupport/iPhoneSimulator/5.1/ Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2
真机目录:/var/mobile/Applications/3B8EC78A-5EEE-4C2F-B0CB-4C3F02B996D2
可见,真机上的目录是/var/mobile/Applications/这个目录下的,和模拟器不一样。这个是Home目录,其他的子目录和模拟器一样。
- 获取Cache目录:
NSArray*paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES); NSString *path = [paths objectAtIndex:0];NSLog(@"%@", path);
- 获取documents目录:
NSArray*paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);NSString *path = [paths objectAtIndex:0];NSLog(@"path:%@", path);
获取Libarary目录:
NSArray*paths =NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask, YES);NSString *path = [paths objectAtIndex:0];NSLog(@"%@", path);
- 获取tmp目录:
NSString*tmpDir = NSTemporaryDirectory(); NSLog(@"%@", tmpDir);
NSFileManager创建目录、文件
- 创建文件:
NSString*rootPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
NSString*plistPath = [rootPathstringByAppendingPathComponent:@"hhk.plist"];
NSFileManager*fileManager = [NSFileManagerdefaultManager];
if(![fileManager fileExistsAtPath:plistPath]) {
[fileManagercreateFileAtPath:plistPathcontents:nilattributes:[NSDictionarydictionary]];//创建一个dictionary文件
}
- 写入文件:
NSMutableDictionary *dictionary= [NSMutableDictionary dictionary];
[mutableDictionarywriteToFile:plistPath atomically:YES]
- 读取文件:
NSMutableDictionary *dictionary= [NSDictionarydictionaryWithContentsOfFile:plistPath];
- 创建目录:
NSArray*paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *documentsDirectory =[pathsobjectAtIndex:0]; NSLog(@"documentsDirectory%@",documentsDirectory); NSFileManager *fileManager = [NSFileManagerdefaultManager]; NSString*testDirectory =[documentsDirectorystringByAppendingPathComponent:@"test"]; // 创建目录
[fileManagercreateDirectoryAtPath:testDirectorywithIntermediateDirectories:YESattributes:nil error:nil];
启动程序后,创建的目录如下:
- 在test目录下创建文件
创建文件怎么办呢?接着上面的代码 testPath 要用stringByAppendingPathComponent拼接上你要生成的文件名,比如test00.txt。这样才能在test下写入文件。testDirectory是上面代码生成的路径哦,不要忘了。我往test文件夹里写入三个文件,test00.txt ,test22.txt,text.33.txt。内容都是写入内容,write String。实现代码如下:
NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test00.txt"]; NSString *testPath2 = [testDirectory stringByAppendingPathComponent:@"test22.txt"]; NSString *testPath3 = [testDirectory stringByAppendingPathComponent:@"test33.txt"]; NSString *string = @"写入内容,write String"; [fileManager createFileAtPath:testPath contents:[string dataUsingEncoding:NSUTF8StringEncoding] attributes:nil]; [fileManager createFileAtPath:testPath2 contents:[string dataUsingEncoding:NSUTF8StringEncoding] attributes:nil]; [fileManager createFileAtPath:testPath3 contents:[string dataUsingEncoding:NSUTF8StringEncoding] attributes:nil]; |
获取目录下的所有文件:
两种方法获取:subpathsOfDirectoryAtPath 和 subpathsAtPath
NSArray*paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString*documentsDirectory= [pathsobjectAtIndex:0]; NSLog(@"documentsDirectory%@",documentsDirectory); NSFileManager *fileManage =[NSFileManagerdefaultManager]; NSString *myDirectory =[documentsDirectorystringByAppendingPathComponent:@"test"]; NSArray *file = [fileManagesubpathsOfDirectoryAtPath: myDirectoryerror:nil]; NSLog(@"%@",file); NSArray *files= [fileManagesubpathsAtPath: myDirectory]; NSLog(@"%@",files);
- fileManager使用操作当前目录
//创建文件管理器
NSFileManager*fileManager = [NSFileManager defaultManager];
NSArray*paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString*documentsDirectory = [pathsobjectAtIndex:0];
//更改到待操作的目录下
[fileManagerchangeCurrentDirectoryPath:[documentsDirectorystringByExpandingTildeInPath]];
//创建文件fileName文件名称,contents文件的内容,如果开始没有内容可以设置为nil,attributes文件的属性,初始为nil
NSString *fileName=@"testFileNSFileManager.txt";
NSArray *array= [[NSArray alloc] initWithObjects:@"helloworld",@"helloworld1", @"hello world2",nil];
[fileManager createFileAtPath:fileNamecontents:array attributes:nil];
这样就创建了testFileNSFileManager.txt并把三个hello world写入文件了
changeCurrentDirectoryPath目录更改到当前操作目录时,做文件读写就很方便了,不用加上全路径
- 删除文件:
[fileManagerremoveItemAtPath:fileNameerror:nil];
- 混合数据的读写:
用NSMutableData创建混合数据,然后写到文件里。并按数据的类型把数据读出来
- 写入数据:
NSString* fileName=@"testFileNSFileManager.txt";
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentsDirectory =[pathsobjectAtIndex:0]; //获取文件路径
NSString *path =[documentsDirectorystringByAppendingPathComponent:fileName]; //待写入的数据
NSString *temp =@"nihao 世界";
int dataInt =1234;
float dataFloat = 3.14f;
//创建数据缓冲
NSMutableData *writer= [[NSMutableData alloc] init];
//将字符串添加到缓冲中
[writerappendData:[tempdataUsingEncoding:NSUTF8StringEncoding]];
//将其他数据添加到缓冲中
[writer appendBytes:&dataIntlength:sizeof(dataInt)];
[writerappendBytes:&dataFloatlength:sizeof(dataFloat)];
//将缓冲的数据写入到文件中
[writer writeToFile:pathatomically:YES];
查看写入的结果:
看到后面的是乱码,那是中文被转成了NSData后,还有int float的二进制
读取刚才写入的数据:
//读取数据:
intintData; float floatData =0.0;
NSString *stringData;
NSData *reader =[NSDatadataWithContentsOfFile:path];
stringData = [[NSStringalloc] initWithData:[readersubdataWithRange:NSMakeRange(0, [templength])]
encoding:NSUTF8StringEncoding];
[readergetBytes:&intData range:NSMakeRange([templength],sizeof(intData))];
[readergetBytes:&floatData range:NSMakeRange([temp length] +sizeof(intData),sizeof(floatData))];
NSLog(@"stringData:%@intData:%d floatData:%f", stringData,intData, floatData);