全名是:Property List,属性列表文件,它是一种用来存储串行化后的对象的文件。属性列表文件的扩展名为.plist ,因此通常被称为 plist文件。文件是xml格式的。
Plist文件通常用于储存用户设置,也可以用于存储捆绑的信息
二,先说文件保存到的几个位置:
1,工程沙盒里(就是程序user Document文件夹下,以读取文件,写入文件方式)
2,工程自身里(就是在工程里手动创建一个如.plist文件,把固定的内容写入,这个需要人工手动写入)
3,工程沙盒里(保存到user Document下,不过不需要读写文件,用系统的 NSUserDefaults 可以快速保存添加读取删除基本数据类型,类似于android里的Sharedpreferences )
先看截图吧
控制台输出的为工程下plist文件和沙盒文件的路径,通过截图我们可以看到,前缀都是统一的,只是到了程序的文件夹后,一个是appname.app,另一个是Documents下。所以存放位置还是不一样的。
首先说一下,工程下的.plist是我们不能在代码中写入的,可以读取,但是不可以写入(目前我是这样的结论,猜测应该是apple为了安全限制的),所以,代码中进行文件写等操作只能在沙盒路径下的文件中操作。
(程序常用固定数据,比如离线地图数据,各城市经纬度信息等需要我们绑定到程序里(比UserDocument安全),那么,可以代码循环写入,把.plist写在沙盒内,然后手动copy到工程目录下,这样就不用我们手动添加啦)
三,三种方式的读写操作。
1-1,创建plist文件。
按command +N快捷键创建,或者File —> New —> New File,选择Resource 下的Property List
1-2,工程路径plist文件读取。
1. //path 读取当前程序定义好的provinces.plist省份城市文件
2. "provinces" ofType:@"plist"];
3.
4. NSDictionary *data = [NSDictionary dictionaryWithContentsOfFile:path];
5. "province"]];//array数组的名称就叫province
1-3,读取后赋值给我们相应的数据类型,就可以直接使用了,就是这么简单。
2-1,沙盒路径plist文件的读取。
1. NSArray *patharray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
2.
3. NSString *path = [patharray objectAtIndex:0];
4.
5. NSString *filepath=[path stringByAppendingPathComponent:@"provinces.plist"];//添加我们需要的文件全称
6.
7. //获取此路径下的我们需要的数据(NSArray,NSDictionary,NSString...)
8. NSMutableArray *rootArray = [NSMutableArray arrayWithContentsOfFile:filepath];//注意,如果想添加新的数据,需要NSMutable类型的
2-2,如果document里没有此文件,会自动创建,读取赋值后,便可使用,同时可以add,update,和remove,具体看上面的截图,一目了然。
3-1,NSUserDefaults快速读写,利用系统提供的方法,我们可以快速保存简单数据类型,如用户登录用户名密码。
1. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];//获取标准函数对象
2. NSMutableDictionary *defaultcoordinate = [defaults objectForKey:@"default_coordinate"];//通过对象获取名称下NSMutableDictionary数据
3. NSString *currentCity = [defaultcoordinate objectForKey:@"c_name"];
3-2,增删改,一看便会。
1. [defaults setObject:@"kaka" forKey:@"newdata"];//添加id对象类型数据
2. [defaults objectForKey:@"newdata"];//获取对象类型数据
3.
4. [defaults setDouble:2013 forKey:@"double"];//添加double类型数据
5. [defaults doubleForKey:@"double"];//获取double类型数据
6.
7. [defaults setBool:NO forKey:@"BOOL"];//添加BOOL类型数据
8. [defaults boolForKey:@"BOOL"];//获取BOOL类型数据
9.
10. [defaults setInteger:12 forKey:@"int"];//添加int类型数据
11. [defaults integerForKey:@"int"];//获取int类型数据
12.
13. [defaults setFloat:0.23 forKey:@"float"];//添加Float类型数据
14. [defaults floatForKey:@"float"];//获取float类型数据
15.
16. [defaults removeObjectForKey:@"newdata"];//删除对象数据
3-3,操作之后记得Synchronize同步操作,否则偶然会因为别的线程占大量内存而没有保存成功
1. [defaults synchronize];
四,沙盒文件打开的方法:
1,可以通过 系统带的 终端工具,在bash命令行模式定位到
2,Finder菜单-前往 此时按住键盘的:option按键,就会显示出:资源库,点击进入
打开资源库后找到/Application Support/iPhone Simulator/文件夹。这里面就是模拟器的各个程序的沙盒目录了。
方法2、这种方法更方便,在Finder上点->前往 然后按住"option"键,就会出现"资源库",其他同上
目录结构
默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件
Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
Library:存储程序的默认设置或其它状态信息;
Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
tmp:提供一个即时创建临时文件的地方。
iTunes在与iPhone同步时,备份所有的Documents和Library文件。
iPhone在重启时,会丢弃所有的tmp文件。
这是上面提到的三个目录 :Documents、Library、 tmp
几个常用的代码示例:
1、获取程序的Home目录
复制代码代码如下:
NSString *homeDirectory = NSHomeDirectory();
NSLog(@"path:%@", homeDirectory);
2、获取document目录
复制代码代码如下:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);
3、获取Cache目录
复制代码代码如下:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"%@", path);
4、获取Library目录
复制代码代码如下:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"%@", path);
5、获取Tmp目录
复制代码代码如下:
NSString *tmpDir = NSTemporaryDirectory();
NSLog(@"%@", tmpDir);
6、写入文件
复制代码代码如下:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
if (!docDir) {
NSLog(@"Documents 目录未找到");
}
NSArray *array = [[NSArray alloc] initWithObjects:@"内容",@"content",nil];
NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];
[array writeToFile:filePath atomically:YES];
7、写入文件
复制代码代码如下:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
NSString *filePath = [docDir stringByAppendingPathComponent:@"testFile.txt"];
NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath];
NSLog(@"%@", array);
8、判断一个文件是否存在,传入全路径(fileExistsAtPath)
复制代码代码如下:
// 创建文件管理器
NSFileManager * fileManager = [NSFileManager defaultManager];
NSString * documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
NSString * filePath = [documents stringByAppendingPathComponent:@"test"];
// 判断一个文件是否存在,传入全路径
if ([fileManager fileExistsAtPath:filePath]) {
NSLog(@"it is exit");
}
9、在Documents里创建目录
复制代码代码如下:
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];
10、在目录下创建文件
复制代码代码如下:
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];
11、获取目录列里所有文件名
两种方法获取: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);
12、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];
13、删除文件
复制代码代码如下:
[fileManager removeItemAtPath:fileName error:nil];