iOS沙盒文件目录详解

1、每个应用的沙盒目录都是相似的,主要包含app的两个文AppName.app
和 data。
【1】AppName.app 目录:这是应用程序的程序包目录,包含应用程序的本
身。(包括资源文件和可执行文件等。程序启动以后,会根据需要从该目录
中动态加载代码或资源到内存)
由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进
行修改,否则可能会使应用程序无法启动。
【2】整个目录是只读的
为了防止被篡改,应用在安装的时候会将该目录签名。非越狱情况下,该目
录中内容是无法更改的;在越狱设备上如果更改了目录内容,对应的签名就
会被改变,这种情况下苹果官网描述的后果是应用程序将无法启动
【3】不会被iTunes同步

2、默认情况下,每个沙盒data含有3个文件夹:Documents, Library 和 tmp。
【1】Documents我们可以将应用程序的数据文件保存在该目录下。不过这
些数据类型仅限于不可再生的数据(如数据库文件,项目配置文件),可再生
的数据文件(如图片缓存文件)应该存放在Library/Cache目录下。会被
iTunes同步。该文件夹除Documents/Inbox 文件外可执行增删改查操作。

【2】Documents/Inbox该目录用来保存由外部应用请求当前应用程序打开
的文件(系统复制到此目录下)此目录下的文件只能读取 或者 删除 不能
修改内容同样会被iTunes同步

【3】Library苹果建议用来存放默认设置或其它状态信息。会被iTunes同步
但是要除了Caches子目录外

【4】Library/Caches主要是缓存文件,用户使用过程中缓存都可以保存在这
个目录中。这个目录就用于保存那些可再生的文件,可以重新下载或者重新
生成的数据应该保存在目录下面。(比如杂志、新闻、地图应用使用的数据库
缓存文件和可下载内容应该保存到这个文件夹)。磁盘空间不够时 系统会删
除 不会被iTunes同步

【5】Library/Preferences应用程序的偏好设置文件。我们使用NSUserDefaults
写的设置数据都会保存到该目录下的一个plist文件中,这就是所谓的写道
plist中! 会被iTunes同步

【6】tmp
各种临时文件,保存应用再次启动时不需要的文件。而且,当应用不再需要
这些文件时应该主动将其删除,因为该目录下的东西随时有可能被系统清理
掉,也可能随着项目退出删掉。
不会被iTunes同步


//取得Documents路径的方法:
- (NSString *)documentFolder{
return [NSHomeDirectory()stringByAppendingPathComponent:@"Documents"];
}

//取得Documents中某个文件的路径
NSString *path= [[self documentFolder]stringByAppendingPathComponent:@"image.png"];

//获取tmp目录
NSString *tempPath= NSTemporaryDirectory();

//补充:取得应用程序包(即bundle)的路径
- (NSString *)bundleFolder{
return [[NSBundle mainBundle]bundlePath];
}

获取这些目录路径的方法:


//返回Documents 路径
//方法1 iOS4.0版本以上的可以使用该方法获取url
- (NSURL *)applicationDocumentsDirectory_New {
NSURL *documentsDictoryURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *storeURL = [documentsDictoryURL URLByAppendingPathComponent:@"Data.sqlite"];
return storeURL;
}

//方法2 iOS4.0版本以下的可以使用该方法获取url
- (NSURL *)applicationDocumentsDirectory_Old {
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); //程序文件夹主目录
NSString *documentsDirectory =[paths objectAtIndex:0]; //Document目录
NSString *storePath =[documentsDirectory stringByAppendingPathComponent:@"Data.sqlite"];
NSURL *storeURL = [NSURL fileURLWithPath:storePath];
return storeURL;
}


//1,获取家目录路径的函数:
NSString *homeDir = NSHomeDirectory();

//2,获取Documents目录路径的方法:
// NSSearchPathForDirectoriesInDomains参数
第一个参数指定了搜索的路径名称,NSDocumentDirectory表示是在Documents中寻找.NSCacheDirectory的话就是在cache文件中寻找.
第二个参数限定了文件的检索范围只在沙箱内部.其意义为用户电脑主目录.也可以修改为网络主机等.
最后一个参数决定了是否展开波浪线符号.展开后才是完整路径,这个布尔值一直为YES.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *docDir = [paths objectAtIndex:0];




//3,获取Caches目录路径的方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES);
NSString *cachesDir = [paths objectAtIndex:0];

//4,获取tmp目录路径的方法:
NSString *tmpDir = NSTemporaryDirectory();

//5,获取应用程序程序包中资源文件路径的方法:
//例如获取程序包中一个图片资源(apple.png)路径的方法:
NSString *imagePath = [[NSBundle mainBundle]pathForResource:@"apple"ofType:@"png"];
UIImage *appleImage = [[UIImagealloc]initWithContentsOfFile:imagePath];
//代码中的mainBundle类方法用于返回一个代表应用程序包的对象。

//6 获取文件中的Image地址及UIImage
NSString*imagePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Image"];
imagePath = [imagePath stringByAppendingPathComponent:@"bg"];
imagePath = [imagePath stringByAppendingPathComponent:@"bg.png"];
【iOS沙盒文件目录详解】

    推荐阅读