一、沙盒机制
ios应用程序只能在为该应用程序创建的文件系统中读取或写入文件,不可以去其它地方访问,此区域称为沙盒。所有的非代码文件都要保存于此(eg:文本文件,声音,图标等)。
二、沙盒目录结构
A、Data文件夹下
/Users/Nina/Library/Developer/CoreSimulator/Devices/1E4B0A2F-AA88-4F61-901C-2DD1939B7FD9/data/Containers/Data/Application/298DC6CF-C19A-4663-B16D-8B6C1C5A383F/Documents/ceshi.sqlite
B、Bundle文件夹下
//应用程序包。应用程序的源文件,包括资源文件和可执行文件 /Users/Nina/Library/Developer/CoreSimulator/Devices/1E4B0A2F-AA88-4F61-901C-2DD1939B7FD9/data/Containers/Bundle/Application/1F738D13-FD4E-446F-B47E-3BCBD9F8E657/SandBoxPath.app
NSString *appPath = [[NSBundle mainBundle] bundlePath];
沙盒中默认包含有三个文件夹(Documents,Library,tmp)
1、Documents:苹果建议将程序创建产生的文件以及应用浏览产生的文件数据保存在该目录下;iTunes 会同步此文件夹中的内容。
2、Library:存储程序的默认设置和其他状态信息。iTunes会备份此目录,但不包含其子目录caches.
(1)library/Caches:存放缓存文件;iTunes不会备份此目录;在应用退出时,该目录下的文件将被删除;保存应用程序再次启动过程中需要的信息。
(2)library/Preferences:存放偏好设置的文件(不应该直接创建偏好设置的文件,而是应该使用NSUserDefaults来取得或设置文件);iTunes 会同步此文件夹中的内容。
总结:一般可将文件存放在Documents或Library/Caches目录下,
两者的区别:Documents可以被iTunes同步备份,但Library/Caches不可以被iTunes同步备份。同步iTunes 是需要花费时间的,所以为了减少同步的时间,可以考虑将一些比体积较大的文件而又不需要备份的文件放到Library/caches下;将重要的数据存放到Documents下。
3、tmp:提供一个创建临时文件的的地方。在应用退出时,该目录下的文件将被删除;也可能在应用不运行时被删除。保存应用程序再次启动过程中不需要的信息。
三、获取沙盒目录方法
//1、获取沙盒主目录
//firstWay
NSString *homePath1= NSHomeDirectory();
NSLog(@"homePath1:%@",homePath1);
//secondWay
NSString *homePath2 = NSHomeDirectoryForUser(NSUserName());
NSLog(@"homePath2:%@",homePath2);
//2、获取Documents目录
NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
NSLog(@"documentsPath:%@",documentsPath);
//3、获取Library目录
NSString *librayPath = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).firstObject;
NSLog(@"libraryPath:%@",librayPath);
//获取library/caches目录
NSString *cachesPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
//4、获取tmp目录
NSString *tmpPath = NSTemporaryDirectory();
NSLog(@"tmpth:%@",tmpPath);
5、返回沙盒路径总方法
在数据存储方面,经常会用到存放路径,写一个返回路径的总方法,是很有必要的。
-(NSString *)gainFilePath:(NSString *)fileName fileDirectory:(NSSearchPathDirectory)directoryName
{
NSString *pathDirectory = NSSearchPathForDirectoriesInDomains(directoryName, NSUserDomainMask, YES).firstObject;
NSString *finalPath = [pathDirectory stringByAppendingPathComponent:fileName];
return finalPath;
}
NSString *filePath = [self gainFilePath:@"nina.txt" fileDirectory:NSDocumentDirectory];
四、获取其他路径的方法
1、plist文件路径
NSString *strDBPath = [[NSBundle mainBundle] pathForResource:@"Paylist" ofType:@"plist"];