1.plist文件概念
Property List 属性列表文件
它是一种用来存储串行化后的对象的文件。属性列表文件的扩展名为.plist ,因此通常被称为 plist文件。文件是xml格式的。
plist文件通常用于储存用户设置,也可以用于存储捆绑的信息。
2.plist文件存储位置
<1>工程里的文件路径
NSBundle * bundle = [NSBundle mainBundle];
NSString * path = [bundle pathForResource:@"plistDocument" ofType:@"plist"];
NSLog(@"%@",path);
输出后的结果 (Xcode7)
/Users/yourname/Library/Developer/CoreSimulator/Devices/sandBoxDirectory/data/Containers/Bundle/Application/sandBoxDirectory/projectName/plistDocument
<2>沙盒里的文件路径
NSArray * pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSLog(@"pathArray = %@",pathArray);
NSString * plistPath = [pathArray objectAtIndex:0];
NSLog(@"沙盒存储目录 = %@",plistPath);
输出后的结果 (Xcode7)
/Users/yourname/Library/Developer/CoreSimulator/Devices/sandBoxDirectory/data/Containers/Bundle/Application/sandBoxDirectory/projectName/plistDocument
可以看出,Xcode7中,直接寻找工程中的plist文件,输出的路径与沙盒路径一致,即运行后沙盒中提供了相同的plist文件。
由此可知,这种情况下,我们找到的路径并非原工程中的路径,对该路径下的文件操作必然也跟工程中的文件无关了。当需要把数据写入plist文件并运用于工程中时,可以先创建文件并存储到沙盒中,再移入工程使用;或者直接利用具体路径在原工程的plist文件上进行改动。
读取plist文件
NSArray * array = [NSArray arrayWithContentsOfFile:filePath];
NSDictionary * dictionary = [NSDictionary dictionaryWithContentsOfFile:filePath];
3.关于沙盒下的存储目录
默认情况下,每个沙盒含有3个文件夹Documents,Library 和 tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件
Documents
程序中建立的或在程序中浏览到的文件数据会保存在该目录下,iTunes备份和恢复的时候会包括此目录
Library
存储程序的默认设置或其它状态信息;
Caches
存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
tmp
存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除
注:iTunes在与iPhone同步时,会备份所有的Documents和Library文件。
iPhone在重启时,会丢弃所有的tmp文件。
那么我们详细看一下沙盒目录的存储情况:
NSArray * pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSLog(@"pathArray = %@",pathArray);
进入NSDocumentDirectory
发现是枚举类型,NSSearchPathDirectory
提供了程序运行后各种文件夹路径
我们看到这几个时已经很明白了(只列举部分):
NSDocumentDirectory
NSLibraryDirectory
NSCachesDirectory
我们需要找什么目录,替换NSSearchPathForDirectoriesInDomains
第一个参数就行了
可能你发现tmp目录呢?没找到啊。的确,NSSearchPathDirectory
里没有tmp目录,可以使用其他的方式寻找:
/** Document的上级目录,即根目录 */
NSHomeDirectory()
/** tmp目录 */
NSTemporaryDirectory()
// 可以这么办
NSString * filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"tmp/plistDocument.plist"];
// 或者直接找到tmp目录下
NSString * tmpPath = NSTemporaryDirectory();
另外,模拟器目录和真机目录的区别
我们用NSHomeDirectory()
输出一下便知
- 模拟器目录
/Users/yourname/Library/Developer/CoreSimulator/Devices/sandBoxDirectory/data/Containers/Bundle/Application/sandBoxDirectory
- 真机目录
/var/mobile/Containers/Data/Application/sandBoxDirectory/Documents
4.NSUserDefaults数据存储位置
[[NSUserDefaults standardUserDefaults] setObject:obj forKey:key];
使用这种方式存储的数据,放置在 /Library/Prefereces 下的一个plist文件中
若想移除,直接removeObjectForKey
或是删掉沙盒即可
以上只是简略的说明文件存储路径的问题,文件管理部分内容将在后续进行补充。