iphone沙盒

iphone沙盒的理解与路径

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

【iphone的沙盒理解】:ios的ipa安装文件就如同一个个盒子一般,放在了/user/applications目录下,以这个程序(比如goodreader)的眼光看外面的世界,他基本什么也看不到,因为他的权限如此之小,以至于他看不到在goodreader的目录外,世界上还有什么?这也就是打开goodreader后不能打开其他程序内的文档的原因。ios的ipa可以随便乱装而不用担心会像windows一样产生很多垃圾文件,因为几乎一个程序所有的东西都放在/user/applications中,少部分在/applications中,有的程序可能获得了ios的官方支持,有了一些更大的权限(绝不会太大,比如官方ipa的qq即使登峰造极,他也不会像symbian系统一样,在桌面搞出个qq的信息小头像),会在其他位置生成一些文件(可能性很小),为了进一步防止恶意ipa程序通过非法途径破坏其他程序,ios进一步为每个文件夹起了一个随机名字,采用uuid方式,就是你现在看到的很长一串数字字母的目录名,这样防止了其他程序猜测其他程序的位置。
【沙盒文件夹的路径】:/Users/“用户名”/Library/Application Support/iPhoneSimulator/User/Applications/2CADA5C1-6B9F-44E9-8F06-6C992E3E99C6/Documents/

2CADA5C1-6B9F-44E9-8F06-6C992E3E99C6是你的应用程序随机生成的编码,每个应用程序文件夹的名字都不一样
iPhone沙盒和文件IO
一、沙盒(sandbox)
出于安全的目的,应用程序只能将自己的数据和偏好设置写入到几个特定的位置上。当应用程序被安装到设备上时,系统会为其创建一个家目录,这个家目录就是应用程序的沙盒。

家目录下共有四个子目录:

Documents目录:您应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。
AppName.app目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。
Library 目录:这个目录下有两个子目录:Caches 和 Preferences
Preferences目录包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好
Caches目录用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。
tmp 目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。

获取这些目录路径的方法:
1,获取家目录路径的函数:
复制代码

  1.     NSString*homeDir = NSHomeDirectory();


2,获取Documents目录路径的方法:
复制代码

  1. NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *docDir = [paths objectAtIndex:0];


3,获取Caches目录路径的方法:
复制代码

  1. NSArray *paths =NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES);
    NSString *cachesDir = [paths objectAtIndex:0];


4,获取tmp目录路径的方法:
复制代码

  1. NSString *tmpDir=  NSTemporaryDirectory();


5,获取应用程序程序包中资源文件路径的方法:
例如获取程序包中一个图片资源(apple.png)路径的方法:
复制代码

  1. NSString *imagePath = [[NSBundle mainBundle]pathForResource:@"apple" ofType:@"png"];
    UIImage *appleImage = [[UIImage alloc]initWithContentsOfFile:imagePath];

代码中的mainBundle类方法用于返回一个代表应用程序包的对象。


二、文件IO

1,将数据写到Documents目录:

复制代码


  1. - (BOOL)writeApplicationData:(NSData *)data toFile:(NSString*)fileName {
        NSArray*paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);    NSString*docDir = [pathsobjectAtIndex:0];    if(!docDir){        NSLog(@"Documentsdirectory notfound!");        returnNO;    }    NSString*filePath = [docDir stringByAppendingPathComponent:fileName];
        return[data writeToFile:filePath atomically:YES];}




2,从Documents目录读取数据:
复制代码

  1. - (NSData *)applicationDataFromFile:(NSString *)fileName {
        NSArray*paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);   NSString *docDir = [pathsobjectAtIndex:0];   NSString *filePath = [docDirstringByAppendingPathComponent:fileName];   NSData *data = [[[NSData alloc]initWithContentsOfFile:filePath]autorelease];   return data;}

 

iPhone app沙盒获取文件

对于一个运行在iPhone得app,它只能访问自己根目录下得一些文件(所谓sandbox).
一个app发布到iPhone上后,它得目录结构如下:
 1、其中得 app root可以用 NSHomeDirectory() 访问到;2、Documents目录就是我们可以用来写入并保存文件得地方,一般可通过:
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentsDirectory = [pathsobjectAtIndex:0];

得到。
3、tmp 目录我们可以在里面写入一些程序运行时需要用得数据,里面写入得数据在程序退出后会没有。可以通过
NSString *NSTemporaryDirectory(void); 方法得到;
4、文件一些主要操作可以通过NSFileManage 来操作,可以通过 [NSFileManger defaultManger]得到它得实例。
相关得一些操作:
创建一个目录: 比如要在Documents下面创建一个test目录,
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSLog(@”%@”,documentsDirectory);NSFileManager *fileManage =[NSFileManager defaultManager];NSString *myDirectory =[documentsDirectorystringByAppendingPathComponent:@“test”];BOOL ok =[fileManage createDirectoryAtPath:myDirectoryattributes:nil];取得一个目录下得所有文件名:(如上面的myDirectory)可用

NSArray *file =[fileManagersubpathsOfDirectoryAtPath: myDirectory error:nil];


NSArray *files = [fileManagersubpathsAtPath: myDirectory ];
读取某个文件:

NSData *data =[fileManger contentsAtPath:myFilePath];//myFilePath是包含完整路径的文件名
或直接用NSData 的类方法:
NSData *data = [NSData dataWithContentOfPath:myFilePath];
保存某个文件:
可以用 NSFileManager的
- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)dataattributes:(NSDictionary *)attr;
或 NSData 的
- (BOOL)writeToFile:(NSString *)pathatomically:(BOOL)useAuxiliaryFile;
- (BOOL)writeToFile:(NSString *)pathoptions:(NSUInteger)writeOptionsMask error:(NSError**)errorPtr;


你可能感兴趣的:(ios,apple,iPhone,library,Symbian,sandbox)