========================
day10 文件管理&Plist&归档
========================
一、NSFileManager
文件管理器
查看 创建 拷贝 移动 删除 等等
#import <Foundation/Foundation.h>
#define PATH @"/Users/liuweizhen/Desktop/WeiZhenDir"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSFileManager *fileManager = [NSFileManager defaultManager];
// 查看
NSError *error = nil;
NSArray *arr = [fileManager contentsOfDirectoryAtPath:PATH error:&error];
if (error) {
NSLog(@"%@", error);
} else {
for (NSString *subpath in arr) {
NSLog(@"%@", subpath);
}
}
// 深度遍历
// 遍历一个文件夹下得所有内容,包括子目录下得所有的内容 递归遍历
NSArray *arr2 = [fileManager subpathsOfDirectoryAtPath:PATH error:&error];
for (NSString *fileName in arr2) {
NSLog(@"%@", fileName);
if ([fileName hasSuffix:@".mp3"]) {
// ...
}
// [fileName pathExtension]; // 文件扩展名
}
// 创建文件
// 检测一个文件/文件夹是否存在 参数必须要写全路径
NSString *filePath = [PATH stringByAppendingPathComponent:@"new.txt"];
BOOL isExsit = [fileManager fileExistsAtPath:filePath];
if (!isExsit) {
// 创建文件
BOOL ret = [fileManager createFileAtPath:filePath contents:nil attributes:nil];
if (ret) {
NSLog(@"文件创建成功");
} else {
NSLog(@"创建失败");
}
} else {
NSLog(@"文件存在");
}
// 获取文件属性
// 返回一个字典
NSDictionary *dict = [fileManager attributesOfItemAtPath:filePath error:nil];
NSLog(@"dict: %@", dict);
// 获取文件大小方法1
long long fileSize1 = [[dict objectForKey:@"NSFileSize"] longLongValue];
NSLog(@"%lld",fileSize1);
// 获取文件大小方法2
long long fileSize2 = [dict fileSize];
NSLog(@"%lld", fileSize2);
// 创建文件夹
/*
返回值:成功yes 失败 no
第一个参数:目标文件夹路径
二 :YES :不管中间目录是否存在 都会创建目标文件夹(如果中间目录不存在那么中间目录也会创建)
NO: 如果中间的目录不存在那么不创建
如果目标文件夹存在,那么不创建新的,直接返回YES
三 文件属性
四 错误信息
*/
NSString *dirPath = [PATH stringByAppendingPathComponent:@"2/3/4"];
BOOL ret1 = [fileManager createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:&error];
if (ret1) { // 如果文件夹原来存在, 则直接返回YES, 并不影响原来文件夹里面的东西,如果不存在,则创建
NSLog(@"创建文件夹成功");
} else {
NSLog(@"文件夹创建失败:%@",error);
}
// 同样创建文件夹之前 可以也首先检测一下文件夹是否存在
BOOL ret3 = [fileManager fileExistsAtPath:dirPath];
if (ret3) {
// NSLog(@"文件夹存在");
} else {
// NSLog(@"文件夹不存在");
}
// 文件/文件夹 copy
// ret1 = [fileManager copyItemAtPath:filePath toPath:PATH error:&error]; // 如果这里toPath写为PATH, 则拷贝失败,因为“File exists”, 文件已存在
ret1 = [fileManager copyItemAtPath:filePath toPath:[PATH stringByAppendingPathComponent:@"1"] error:&error]; // 如果这里toPath写为PATH, 则拷贝失败,因为“File exists”, 文件已存在
if (error) {
// NSLog(@"拷贝文件失败:%@", error);
} else {
// NSLog(@"拷贝成功");
}
// 文件/文件夹移动&重命名
error = nil;
NSString *destPath = [[PATH stringByAppendingPathComponent:@"2"] stringByAppendingPathComponent:@"MyMoveFile"];
ret3 = [fileManager moveItemAtPath:filePath toPath:destPath error:&error];
if (error) {
NSLog(@"%@", error);
} else {
NSLog(@"移动文件成功");
}
// 文件删除 :谨慎 使用 不会把删除的文件放在废纸篓中
ret3 = [fileManager removeItemAtPath:destPath error:nil];
if (ret3) {
NSLog(@"删除成功");
}
}
return 0;
}
二、NSFilehandle 文件读写
打开文件
只读打开
fileHandleForReadingAtPath:
只写打开
fileHandleForWritingAtPath:
读写打开
fileHandleForUpdatingAtPath:
关闭
closeFile
读文件
// 每次读取指定字节长度的数据readDataOfLength 每调用一次 偏移量就偏移一次
readDataOfLength:10 // 读10字节数据 读完之后偏移10字节
readDataToEndOfFile // 从当前偏移量读到文件尾
seekToFileOffset: // seekToFileOffset 把偏移量定位到指定的位置
seekToFileOffset:0 // 0 文件首
写文件
writeData: // 写一次那么文件偏移量就可以移动一次
synchronizeFile // 立即同步到磁盘
实例:
比如把文件A中的内容替换为 @“hello”
1. 打开文件
2. 清空它 truncateFileAtOffset:0
3.把@“hello”写进去:
NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding];
[fileHandle writeData:data];
[fileHandle closeFile];
永久存储 持久经存储 本地化
plist
plist文件 就是属性列表 可以持久化保存一些小得数据,要求数据类型必须是NSString NSArray NSDictionary NSData NSDate NSNumber
要把一些数据存到plist文件中,必须要通过数组或者字典
1.把要保存的符合要求的数据对象地址保存在数组/字典中
2.调用数组或者字典的写文件函数 进行存储
写入plist文件 不存在会自己创建 存在会覆盖 第二个参数时候考虑线程安全
[dict writeToFile:@"/Users/liuweizhen/Desktop/newInfo.plist" atomically:YES];
读取plist文件
数据存储
1.1Plist
<1> 什么是plist文件, plist文件的作用
1.plist文件:
文件内容 数据类型 NSString NSNumber NSDate NSData NSArray NSDictionary 不能是自定义类型的对象 比如 Dog 类对象
2.作用:对一些登陆注册信息或者程序的配置信息(小数据)进行持久化存储图片名字
<2> 如何创建plist文件, 如何编辑plist文件
Plist文件内容的格式是XML语法格式
1.Xcode创建
Newfile —》OSX/iOS —>resource —>Property List 进行命名创建
然后根据 所要存储的数据类型 进行存储
2.代码创建
可以通过数组 /字典进行存储 我们可以把我们 想要保存的数据存在数组 或者字典中,然后通过数组或者字典的相关写函数 写入plist 文件
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
<3> 如何在程序中读取plist文件数据
用数组或者字典的读文件函数
数据持久化存储
文件管理 NSFileManager / NSFileHandle
plist 文件
归档 对象->存储到磁盘
数据库
MySql -> sun(java)收购MySql -> Oracle收购Sun {Oracle, MySql}
SQL Server
DB2 IBM
手机端 Sqlite
1.2归档
<1>什么是归档和解档
1.归档(也称对象序列化)就是通过某种格式把对象保存为本地文件,以便以后读回该对象的内容
2.解档(也称解归档/读档)就是把归档的对象文件读成原来的对象的过程。
<2>如何归档和解档
1.系统类的归档和解档
注:1.NSDictionary也可以直接进行归档和解档
2.归档的对象包括这个对象中的属性,它们所属类的都必须要遵守NSCoding 协议才能归档和解档
2.自定义类的归档和解档
如果自定义的类对象要进行归档那么这个对象的属性所属的类也必须要遵守归档协议NSCoding
必须实现以下两个方法:
//归档的时候调用的方法
- (void)encodeWithCoder:(NSCoder *)aCoder;
//解归档的时候要调用的函数
- (id)initWithCoder:(NSCoder *)aDecoder;
归档:
BOOL ret = [NSKeyedArchiver archiveRootObject:dict toFile:path];
解归档
NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
自定义对象归档:
现在有一辆汽车,汽车由引擎构成,现在我们需要把汽车对象进行本地持久化数据存储,那么这个时候我们就需要进行归档
对象如果要进行归档,必须要遵守NSCoding 协议,实现里面的两个方法,对象的属性如果是对象指针类型,那么这些属性所属的类也要遵守NSCoding 协议,递归下去。
归档的时候会对整个对象中涉及到所有属性包括属性指向的对象都要进行存储.实际上归档类似于深拷贝
作业:
现在有一辆汽车,汽车由引擎构成,现在我们需要把汽车对象进行本地持久化数据存储,那么这个时候我们就需要进行归档
day10 文件管理&Plist&归档
========================
一、NSFileManager
文件管理器
查看 创建 拷贝 移动 删除 等等
#import <Foundation/Foundation.h>
#define PATH @"/Users/liuweizhen/Desktop/WeiZhenDir"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSFileManager *fileManager = [NSFileManager defaultManager];
// 查看
NSError *error = nil;
NSArray *arr = [fileManager contentsOfDirectoryAtPath:PATH error:&error];
if (error) {
NSLog(@"%@", error);
} else {
for (NSString *subpath in arr) {
NSLog(@"%@", subpath);
}
}
// 深度遍历
// 遍历一个文件夹下得所有内容,包括子目录下得所有的内容 递归遍历
NSArray *arr2 = [fileManager subpathsOfDirectoryAtPath:PATH error:&error];
for (NSString *fileName in arr2) {
NSLog(@"%@", fileName);
if ([fileName hasSuffix:@".mp3"]) {
// ...
}
// [fileName pathExtension]; // 文件扩展名
}
// 创建文件
// 检测一个文件/文件夹是否存在 参数必须要写全路径
NSString *filePath = [PATH stringByAppendingPathComponent:@"new.txt"];
BOOL isExsit = [fileManager fileExistsAtPath:filePath];
if (!isExsit) {
// 创建文件
BOOL ret = [fileManager createFileAtPath:filePath contents:nil attributes:nil];
if (ret) {
NSLog(@"文件创建成功");
} else {
NSLog(@"创建失败");
}
} else {
NSLog(@"文件存在");
}
// 获取文件属性
// 返回一个字典
NSDictionary *dict = [fileManager attributesOfItemAtPath:filePath error:nil];
NSLog(@"dict: %@", dict);
// 获取文件大小方法1
long long fileSize1 = [[dict objectForKey:@"NSFileSize"] longLongValue];
NSLog(@"%lld",fileSize1);
// 获取文件大小方法2
long long fileSize2 = [dict fileSize];
NSLog(@"%lld", fileSize2);
// 创建文件夹
/*
返回值:成功yes 失败 no
第一个参数:目标文件夹路径
二 :YES :不管中间目录是否存在 都会创建目标文件夹(如果中间目录不存在那么中间目录也会创建)
NO: 如果中间的目录不存在那么不创建
如果目标文件夹存在,那么不创建新的,直接返回YES
三 文件属性
四 错误信息
*/
NSString *dirPath = [PATH stringByAppendingPathComponent:@"2/3/4"];
BOOL ret1 = [fileManager createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:&error];
if (ret1) { // 如果文件夹原来存在, 则直接返回YES, 并不影响原来文件夹里面的东西,如果不存在,则创建
NSLog(@"创建文件夹成功");
} else {
NSLog(@"文件夹创建失败:%@",error);
}
// 同样创建文件夹之前 可以也首先检测一下文件夹是否存在
BOOL ret3 = [fileManager fileExistsAtPath:dirPath];
if (ret3) {
// NSLog(@"文件夹存在");
} else {
// NSLog(@"文件夹不存在");
}
// 文件/文件夹 copy
// ret1 = [fileManager copyItemAtPath:filePath toPath:PATH error:&error]; // 如果这里toPath写为PATH, 则拷贝失败,因为“File exists”, 文件已存在
ret1 = [fileManager copyItemAtPath:filePath toPath:[PATH stringByAppendingPathComponent:@"1"] error:&error]; // 如果这里toPath写为PATH, 则拷贝失败,因为“File exists”, 文件已存在
if (error) {
// NSLog(@"拷贝文件失败:%@", error);
} else {
// NSLog(@"拷贝成功");
}
// 文件/文件夹移动&重命名
error = nil;
NSString *destPath = [[PATH stringByAppendingPathComponent:@"2"] stringByAppendingPathComponent:@"MyMoveFile"];
ret3 = [fileManager moveItemAtPath:filePath toPath:destPath error:&error];
if (error) {
NSLog(@"%@", error);
} else {
NSLog(@"移动文件成功");
}
// 文件删除 :谨慎 使用 不会把删除的文件放在废纸篓中
ret3 = [fileManager removeItemAtPath:destPath error:nil];
if (ret3) {
NSLog(@"删除成功");
}
}
return 0;
}
二、NSFilehandle 文件读写
打开文件
只读打开
fileHandleForReadingAtPath:
只写打开
fileHandleForWritingAtPath:
读写打开
fileHandleForUpdatingAtPath:
关闭
closeFile
读文件
// 每次读取指定字节长度的数据readDataOfLength 每调用一次 偏移量就偏移一次
readDataOfLength:10 // 读10字节数据 读完之后偏移10字节
readDataToEndOfFile // 从当前偏移量读到文件尾
seekToFileOffset: // seekToFileOffset 把偏移量定位到指定的位置
seekToFileOffset:0 // 0 文件首
写文件
writeData: // 写一次那么文件偏移量就可以移动一次
synchronizeFile // 立即同步到磁盘
实例:
比如把文件A中的内容替换为 @“hello”
1. 打开文件
2. 清空它 truncateFileAtOffset:0
3.把@“hello”写进去:
NSData *data = [s dataUsingEncoding:NSUTF8StringEncoding];
[fileHandle writeData:data];
[fileHandle closeFile];
永久存储 持久经存储 本地化
plist
plist文件 就是属性列表 可以持久化保存一些小得数据,要求数据类型必须是NSString NSArray NSDictionary NSData NSDate NSNumber
要把一些数据存到plist文件中,必须要通过数组或者字典
1.把要保存的符合要求的数据对象地址保存在数组/字典中
2.调用数组或者字典的写文件函数 进行存储
写入plist文件 不存在会自己创建 存在会覆盖 第二个参数时候考虑线程安全
[dict writeToFile:@"/Users/liuweizhen/Desktop/newInfo.plist" atomically:YES];
读取plist文件
数据存储
1.1Plist
<1> 什么是plist文件, plist文件的作用
1.plist文件:
文件内容 数据类型 NSString NSNumber NSDate NSData NSArray NSDictionary 不能是自定义类型的对象 比如 Dog 类对象
2.作用:对一些登陆注册信息或者程序的配置信息(小数据)进行持久化存储图片名字
<2> 如何创建plist文件, 如何编辑plist文件
Plist文件内容的格式是XML语法格式
1.Xcode创建
Newfile —》OSX/iOS —>resource —>Property List 进行命名创建
然后根据 所要存储的数据类型 进行存储
2.代码创建
可以通过数组 /字典进行存储 我们可以把我们 想要保存的数据存在数组 或者字典中,然后通过数组或者字典的相关写函数 写入plist 文件
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
<3> 如何在程序中读取plist文件数据
用数组或者字典的读文件函数
数据持久化存储
文件管理 NSFileManager / NSFileHandle
plist 文件
归档 对象->存储到磁盘
数据库
MySql -> sun(java)收购MySql -> Oracle收购Sun {Oracle, MySql}
SQL Server
DB2 IBM
手机端 Sqlite
1.2归档
<1>什么是归档和解档
1.归档(也称对象序列化)就是通过某种格式把对象保存为本地文件,以便以后读回该对象的内容
2.解档(也称解归档/读档)就是把归档的对象文件读成原来的对象的过程。
<2>如何归档和解档
1.系统类的归档和解档
注:1.NSDictionary也可以直接进行归档和解档
2.归档的对象包括这个对象中的属性,它们所属类的都必须要遵守NSCoding 协议才能归档和解档
2.自定义类的归档和解档
如果自定义的类对象要进行归档那么这个对象的属性所属的类也必须要遵守归档协议NSCoding
必须实现以下两个方法:
//归档的时候调用的方法
- (void)encodeWithCoder:(NSCoder *)aCoder;
//解归档的时候要调用的函数
- (id)initWithCoder:(NSCoder *)aDecoder;
归档:
BOOL ret = [NSKeyedArchiver archiveRootObject:dict toFile:path];
解归档
NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
自定义对象归档:
现在有一辆汽车,汽车由引擎构成,现在我们需要把汽车对象进行本地持久化数据存储,那么这个时候我们就需要进行归档
对象如果要进行归档,必须要遵守NSCoding 协议,实现里面的两个方法,对象的属性如果是对象指针类型,那么这些属性所属的类也要遵守NSCoding 协议,递归下去。
归档的时候会对整个对象中涉及到所有属性包括属性指向的对象都要进行存储.实际上归档类似于深拷贝
作业:
现在有一辆汽车,汽车由引擎构成,现在我们需要把汽车对象进行本地持久化数据存储,那么这个时候我们就需要进行归档