首页 > 其他 > 详细

ios沙盒及文件操作

时间:2014-02-17 08:26:09      阅读:417      评论:0      收藏:0      [点我收藏+]

  • iOS沙盒机制:

iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。

1、每个应用程序都有自己的存储空间

2、应用程序不能翻过自己的围墙去访问别的存储空间的内容

3、应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。

通过这张图只能从表层上理解sandbox是一种安全体系,应用程序的所有操作都要通过这个体系来执行,其中核心内容是:sandbox对应用程序执行各种操作的权限限制。

bubuko.com,布布扣


  • 打开沙盒目录

1、模拟器沙盒目录


bubuko.com,布布扣

2、目录结构

默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件

Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录

Library:存储程序的默认设置或其它状态信息;

Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除

tmp:提供一个即时创建临时文件的地方。

iTunes在与iPhone同步时,备份所有的Documents和Library文件。

iPhone在重启时,会丢弃所有的tmp文件。


bubuko.com,布布扣

真机可以通过同步助手打开,如下图:


bubuko.com,布布扣

  • 获取沙盒的目录
  • 获取home目录:

NSString *homeDirectory = NSHomeDirectory();
NSLog(@"path:%@", homeDirectory);

结果:

模拟器目录:/Users/tingxuan.qhm/Library/Application Support/iPhone Simulator/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]) {

         [fileManager createFileAtPath:plistPathcontents:nilattributes:[NSDictionary dictionary]];//创建一个dictionary文件

    }

  • 写入文件:

 NSMutableDictionary  *dictionary = [NSMutableDictionary dictionary];

[mutableDictionary writeToFile:plistPath atomically:YES]

  • 读取文件:

 NSMutableDictionary  *dictionary = [NSDictionarydictionaryWithContentsOfFile:plistPath];

  • 创建目录:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
NSString *documentsDirectory = [paths objectAtIndex:0];  
NSLog(@"documentsDirectory%@",documentsDirectory);  
NSFileManager *fileManager = [NSFileManager defaultManager];  
NSString *testDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];  
// 创建目录
[fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YES attributes:nil error:nil];
启动程序后,创建的目录如下:

bubuko.com,布布扣

  • 在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 = [paths objectAtIndex:0];  
    NSLog(@"documentsDirectory%@",documentsDirectory);  
    NSFileManager *fileManage = [NSFileManager defaultManager];  
    NSString *myDirectory = [documentsDirectory stringByAppendingPathComponent:@"test"];  
    NSArray *file = [fileManage subpathsOfDirectoryAtPath: myDirectory error:nil]; 
    NSLog(@"%@",file);  
    NSArray *files = [fileManage subpathsAtPath: myDirectory ]; 
    NSLog(@"%@",files); 
fileManager使用操作当前目录
//创建文件管理器
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    //更改到待操作的目录下
    [fileManager changeCurrentDirectoryPath:[documentsDirectory stringByExpandingTildeInPath]];
    //创建文件fileName文件名称,contents文件的内容,如果开始没有内容可以设置为nil,attributes文件的属性,初始为nil
    NSString * fileName = @"testFileNSFileManager.txt";
    NSArray *array = [[NSArray alloc] initWithObjects:@"hello world",@"hello world1", @"hello world2",nil];
    [fileManager createFileAtPath:fileName contents:array attributes:nil];
这样就创建了testFileNSFileManager.txt并把三个hello world写入文件了
bubuko.com,布布扣
changeCurrentDirectoryPath目录更改到当前操作目录时,做文件读写就很方便了,不用加上全路径
  • 删除文件:
[fileManager removeItemAtPath:fileName error:nil];
  • 混合数据的读写:
用NSMutableData创建混合数据,然后写到文件里。并按数据的类型把数据读出来
写入数据:
 NSString * fileName = @"testFileNSFileManager.txt";
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    //获取文件路径
    NSString *path = [documentsDirectory stringByAppendingPathComponent:fileName];
    //待写入的数据
    NSString *temp = @"nihao 世界";
    int dataInt = 1234;
    float dataFloat = 3.14f;
    //创建数据缓冲
    NSMutableData *writer = [[NSMutableData alloc] init];
    //将字符串添加到缓冲中
    [writer appendData:[temp dataUsingEncoding:NSUTF8StringEncoding]];   
    //将其他数据添加到缓冲中
    [writer appendBytes:&dataInt length:sizeof(dataInt)];
    [writer appendBytes:&dataFloat length:sizeof(dataFloat)];  
    //将缓冲的数据写入到文件中
    [writer writeToFile:path atomically:YES]; 
查看写入的结果:
bubuko.com,布布扣
看到后面的是乱码,那是中文被转成了NSData后,还有int float的二进制
读取刚才写入的数据:
//读取数据:
    int intData;
    float floatData = 0.0;
    NSString *stringData;
    
    NSData *reader = [NSData dataWithContentsOfFile:path];
    stringData = [[NSString alloc] initWithData:[reader subdataWithRange:NSMakeRange(0, [temp length])]
                                   encoding:NSUTF8StringEncoding];
    [reader getBytes:&intData range:NSMakeRange([temp length], sizeof(intData))];
    [reader getBytes:&floatData range:NSMakeRange([temp length] + sizeof(intData), sizeof(floatData))];
    NSLog(@"stringData:%@ intData:%d floatData:%f", stringData, intData, floatData);

打印出来的结果:

2012-06-17 23:51:14.723 IosSandbox[1285:f803] stringData:nihao hello! intData:1234332 floatData:3.140000






ios沙盒及文件操作

原文:http://blog.csdn.net/tingxuan_qhm/article/details/19291583

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!