目录操作和文件管理
学习目标
1.理解单例
2.掌握NSFileManager类常用的文件管理操
3.掌握NSFileHandle类常用的文件数据操作
4.了解NSData类的常用操作
5.掌握Plist文件读写
——————————————————————
通常程序在运行中或者程序结束之后,需要保存一些信息,而且需要持久化存储信息,比如登陆信息、视频播放记录、收藏记录等等,那么我们可以采用以下几种方式对数据进行持久化保存.
1.1单例模式(当前对象有且仅有一个实例)
好处:只有一个实例,数据共享。
单例模式是一种常用的设计模式。在应用这个模式时,
单例对象的类必须保证只有一个实例存在,而且自行实例化并向整个
系统提供这个实例。如果希望在系统中某个类的对象只能存在一个,
单例模式是最好的解决方案。
其实单例类似C语言中的全局变量
在整个程序声明周期内,该对象只有一份存在内存中
可以在多个对象之间共享数据。
<1>单例创建
(1) 单例的创建方法通常以default/shared/standard 等等开头
(2) 单例不需要release 或者 autorelease ,因为单例的生命周期为整个程序。
2.方法:
2.1 NSFileManager
<1>创建文件管理器单例对象 [NSFileManager defaultManager] <2>遍历目录下的内容 //浅度遍历当前目录下的文件 /* contentsOfDirectoryAtPath:要遍历的路径 error:错误信息 */ NSArray *array = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:path error:&error]; //深度遍历 array = [fileManger subpathsOfDirectoryAtPath:path error:nil]; <3>判断文件是否存在 /* 判断文件是否存在的时候一定要加后缀。 path中如果有后缀表示文件,不加后缀表示文件夹。 */ BOOL isExist = [fileManger fileExistsAtPath:path]; if (isExist) { NSLog(@"存在"); } else { NSLog(@"不存在"); } <4>创建文件和目录 //创建文件 /* createFileAtPath:要创建文件的路径 contents:文件内容(NSData类型) attributes:文件属性,一般为nil,nil表示采用默认属性。 */ //注意:如果文件已经存在会覆盖 BOOL createOK = [fileManger createFileAtPath:path contents:nil attributes:nil]; //创建目录 /* createDirectoryAtPath:要创建的目录,如果文件夹已经存在不会覆盖 withIntermediateDirectories:是否有中间目录 attributes:文件夹的属性,nil表示默认属性 error:错误信息 */ createOK = [fileManger createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error]; <5>拷贝文件/目录 //目录与目录拷贝 [fileManger copyItemAtPath:fromFilePath toPath:toDirPath error:&error]; //文件与文件拷贝 [fileManger copyItemAtPath:fromFilePath toPath:toFilePath error:&error]; <6>移动文件/目录 [fileManger moveItemAtPath:frompath toPath:toPath error:nil]; <7>删除文件/目录 [fileManger removeItemAtPath:toPath error:nil]; <8>获取文件属性 NSDictionary *attributes = [fileManger attributesOfItemAtPath:path error:nil]; NSLog(@"文件的属性:%@",attributes);
2.2 NSData(二进制数据)
<1>把NSString转换为NSData
NSData *data = [string dataUsingEncoding:
NSUTF8StringEncoding]
<2>把NSData转换为NSString
NSString *convertString = [[NSString alloc]
initWithData:data encoding:NSUTF8StringEncoding]
2.3 NSFileHandle(文件句柄类)
对文件进行读写首先需要NSFileHandle打开文件,
NSFileHandle对文件进行读写都是NSData类型的二进制数据.
<1>打开文件方法 //只读的句柄 NSFileHandle *readOnlyHandle = [NSFileHandle fileHandleForReadingAtPath:path]; //只写的句柄 NSFileHandle *writeOnlyHandle = [NSFileHandle fileHandleForWritingAtPath:path]; //读写句柄 NSFileHandle *readAndWriteHandle = [NSFileHandle fileHandleForUpdatingAtPath:path]; <2>读指定长度的数据(单位为字节) //读取5个字节数据 NSData *data = [readOnlyHandle readDataOfLength:5]; <3>从当前偏移量读到文件尾 [readOnlyHandle readDataToEndOfFile] [readAndWriteHandle readDataToEndOfFile] <4>设置文件偏移量(单位为字节) [readOnlyHandle seekToFileOffset:偏移的字节数]; <5>将文件偏移量定位到文件尾 [readOnlyHandle seekToEndOfFile]; <6>写文件(不覆盖的时候需要设置偏移量) //1.先把偏移量指到文件尾部 [readAndWriteHandle seekToEndOfFile]; //2.写入到指定路径 [readAndWriteHandle writeData:[@"abcdef" dataUsingEncoding:NSUTF8StringEncoding]]; <7>关闭文件句柄 //关闭文件句柄,关闭后(不需要)就不能再操作文件了 [readAndWriteHandle closeFile]; [readOnlyHandle closeFile]; [writeOnlyHandle closeFile];
3 Plist
<1> 什么是plist文件, plist文件的作用
1.plist文件:property list 属性列表文件,文件的内容只能是 NSString,NSNumber,NSDate,NSData,NSArray,NSDictionary类的对象内容,不能保存其他类型数据
2.作用:对一些登陆注册信息或者程序的配置信息(小数据)进行持久化存储
<2> 如何创建plist文件, 如何编辑plist文件
Plist文件内容的格式是XML语法格式
1.Xcode创建
1.点击右键—>New File 弹出一对话框
2.iOS程序选中iOS栏中的Resource或者Mac程序选中OS X 栏中的resource
3.点击Resource中的Property List 创建plist文件
4.点击文件中的'+'可以添加数据
2.代码创建
如果要把 NSString NSNumber NSDate NSData NSArray NSDictionary 的对象写入文件一般就用plist文件
我们需要这些数据保存到一个数组或者字典中,然后调用数组和字典的相关函数把数 组NSArray或者字典NSDictionary写入plist文件
//NSArray和NSDictionary写文件方法
- (BOOL)writeToFile:(NSString *)path atomically:
(BOOL)useAuxiliaryFile;
<3> 如何在程序中读取plist文件数据
Plist文件的根节点(数据的最外层)通常是数组或者字典
如果Plist文件的根节点是字典那么使用字典的类方法
+ (id)dictionaryWithContentsOfFile:(NSString *)path;
读写Plist文件
如果根节点是数组那么使用数组的类方法
+ (id)arrayWithContentsOfFile:(NSString *)path;
读取Plist文件。
注:上述两个方法只能读取Plist文件,不能读取其他格式的文件。