一:文件管理器 —NSFileManager
本小节主要说一下 NSFileManager 的defaultManager 方法,因为这个方法使用单利模式写的
废话不多说,直接上代码:
#import <Foundation/Foundation.h>
#import "User.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//创建一个文件管理器,这节主要说的就是文件管理器的defaultManager方法,
//这是个单利模式的方法,后面我们会模仿一个
NSFileManager *fileManager1 = [NSFileManager defaultManager];
NSLog(@"fileManager1 的地址为:%p",fileManager1);
NSFileManager *fileManager2 = [NSFileManager defaultManager];
NSLog(@"fileManager2 的地址为:%p",fileManager2);
NSFileManager *fileManager3 = [[NSFileManager alloc]init];
NSLog(@"fileManager3 的地址为:%p",fileManager3);
NSFileManager *fileManager4 = [NSFileManager defaultManager];
NSLog(@"fileManager4 的地址为:%p",fileManager4);
//为什么上面的结果是哪个样子的呢?没有创建新的对象吗?
//这是因为defaultManager 是单利模式的方法,(两个对象指向同一块地址,就跟string中两个对象指向同一块地址一样)
//我们来重新写一个方法,搞清他的工作原理
//创建一个User类,来模仿他,我们写一个方法叫做defaultUser的方法
/*
写单利模式之前结果是不一样的
User *u1 = [User defaultUser];
NSLog(@"u1的地址为:%@",u1);
User *u2 = [User defaultUser];
NSLog(@"u2的地址为:%@",u2);
*/
//写好单利模式之后
User *u1 = [User defaultUser];
u1.age=10;
NSLog(@"u1的地址为:%p",u1);
User *u2 = [User defaultUser];
NSLog(@"u2的age是不是10呢????请看结果:%i",u2.age);
NSLog(@"u2的地址为:%p",u2);
User *u3 = [[User alloc]init];
NSLog(@"u3的地址为:%p",u3);
//查看打印结果可以看出我们打印成功了
}
return 0;
}
自己模拟写一个单利模式,创建一个User类,下面是user类的.h文件
#import <Foundation/Foundation.h>
@interface User : NSObject
@property(nonatomic,assign)int age;
+(User *)defaultUser;
@end
下面User类的.m文件,重点再这里面:
#import "User.h"
@implementation User
//static 变量就是说,在整个程序没有退出之前,只需要创建一次,就能够一直的使用。
static User *instance = nil;
+(User *)defaultUser
{
if (instance == nil) {
instance = [[self alloc]init];
}
//return [[self alloc]init];单利模式之前
return instance;
}
@end
二:获取文件属性
文件属性就是指:获得文件创建时间,文件大小,文件修改时间等一些属性;(右击文件夹显示简介中会有)
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
/*
//我们先回忆一下NSString 是怎么把数据写进文件的
NSString *str = @"www.baidu.com";
NSString *path = @"/Users/renwenyi/Desktop/Text/text.txt";
NSError *error;
BOOL isWriteSuccess = [str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (isWriteSuccess) {
NSLog(@"创建成功");
}
else
{
NSLog(@"error");
}
*/
//1:获取文件管理器
NSFileManager *fileManager = [NSFileManager defaultManager];
//文件属性可右键文件夹点击显示简介中查看,attribute属性的意思
NSString *path = @"/Users/renwenyi/Desktop/Text/text.txt";
NSString *error;
NSDictionary *dict = [fileManager attributesOfItemAtPath:path error:&error];
if (error !=nil) {
NSLog(@"error 为:%@",error);
}else
{
NSLog(@"dict 为:%@",dict);
NSData *date = [dict objectForKey:NSFileCreationDate];
NSString *size = [dict objectForKey:NSFileSize];
NSData *dateModiy = [dict objectForKey:NSFileModificationDate];
NSLog(@"文件创建时间:%@,文件大小为:%@,文件修改日期为:%@",date,size,dateModiy);
}
}
return 0;
}
三:获得文件目录下的文件与子目录列表
具体实现如下所示:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1:首先要获得文件管理器
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path = @"/Users/renwenyi/Desktop/Text";
NSString *error;
//这个方法只能够获得目标目录下第一级目录,也就是说如果你的文件夹里面还有文件夹,那么这个第二层文件夹里面的内容就不会再显示出来了,只能显示出你的第一层文件夹信息
NSArray *array = [fileManager contentsOfDirectoryAtPath:path error:&error];
NSLog(@"文件目录下的内容为:%@",array);
//2:如果我们想要显示一个文件夹中的所有元素,(就是逐级所有子集的目录)包括文件夹下的文件里面东西,那么就要用到下面这个方法
NSArray *array2 = [fileManager subpathsOfDirectoryAtPath:path error:&error];
NSLog(@"所有文件为:%@",array2);
//如果是第二级目录下的文件会在文件夹后面有个“/”,见图解
}
return 0;
}
四:管理目录
1:创建目录
2:移动目录
3:删除目录
4:copy内容
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1:创建目录
/*
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path = @"/Users/renwenyi/Desktop/wenyiFloder/ccc";
NSString *error;
//withIntermediateDirectories YES表示它会自动的逐级进行创建目录,NO表示只能创建一级目录
BOOL isCreateSuccess = [fileManager createDirectoryAtPath:path withIntermediateDirectories:YES attributes:nil error:&error];
if (isCreateSuccess) {
NSLog(@"创建成功");
}
else
{
NSLog(@"创建失败");
}*/
//2:移动目录(相当于剪切操作,但是剪切的是文件夹中的东西,剪切的文件夹消失);
/*
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path1 = @"/Users/renwenyi/Desktop/wenyiFloder";
NSString *path2 = @"/Users/renwenyi/Desktop/newwenyiFloder";
NSError *error ;
BOOL isMoveSuccess = [fileManager moveItemAtPath:path1 toPath:path2 error:&error];
if (isMoveSuccess) {
NSLog(@"移动成功");
}
else
{
NSLog(@"移动失败");
}
*/
//3:删除目录
/*
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path = @"/Users/renwenyi/Desktop/newwenyiFloder";
NSError *error;
//到回收站里面了
BOOL isremoveSuccess = [fileManager removeItemAtPath:path error:&error];
if (isremoveSuccess) {
NSLog(@"删除成功");
}
else
{
NSLog(@"删除失败");
}
*/
//4:copy 内容
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path1 = @"/Users/renwenyi/Desktop/wenyiFolder";
NSString *path2 = @"/Users/renwenyi/Desktop/newwenyiFolder";
NSError *error;
BOOL isCopySuccess = [fileManager copyItemAtPath:path1 toPath:path2 error:&error];
if (isCopySuccess) {
NSLog(@"copy成功");
}
else
{
NSLog(@"拷贝失败 %@",error);
}
}
return 0;
}
五:管理文件
代码中的文件用的是一张图片
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1:获得一个文件,并根据它在创建一个文件
/*
NSString *path = @"/Users/renwenyi/Desktop/屏幕快照.png";
//NSData 只要是文件格式他都能读取,eg:mp3,mp4,rmvb,mkv,pdf,doc,txt,都可以把这些当成一个文件
NSData *data = [NSData dataWithContentsOfFile:path];
NSLog(@"%ld",data.length);
//目标:把一个文件创建成一个新的文件(以上面的data为例,把它当成一个文件)
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path2 = @"/Users/renwenyi/Desktop/屏幕快照2.png";
BOOL isCreateSuccess = [fileManager createFileAtPath:path2 contents:data attributes:nil];
if (isCreateSuccess) {
NSLog(@"创建成功");
}else
{
NSLog(@"创建失败");
}
*/
//2:移动文件到指定的目录,移动相当于剪切操作
/*
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path1 = @"/Users/renwenyi/Desktop/12.png";
NSString *path2 = @"/Users/renwenyi/Desktop/456/123455.png";
NSString *error;
BOOL isMoveSuccess = [fileManager moveItemAtPath:path1 toPath:path2 error:&error];
if (isMoveSuccess) {
NSLog(@"移动成功");
}
else
{
NSLog(@"error %@",error);
}
*/
//3:删除文件
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *path1 = @"/Users/renwenyi/Desktop/123455.png";
NSError *error;
BOOL isRemoveSuccess = [fileManager removeItemAtPath:path1 error:&error];
if (isRemoveSuccess) {
NSLog(@"删除成功");
}
else
{
NSLog(@"error %@",error);
}
}
return 0;
}
六:使用NSData处理数据
当我们用到音频文件,文本文件,视频文件的时候就必须要用到NSData数据类型
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//1:当我们用到音频文件,文本文件,视频文件的时候就必须要用到NSData数据类型
//先把一个字符串写入桌面txt
/*
NSString *str = @"www.baidu.com";
NSString *path1 = @"/Users/renwenyi/Desktop/renwenyi.txt";
NSError *error;
[str writeToFile:path1 atomically:YES encoding:NSUTF8StringEncoding error:&error];
*/
//注意:NSData是一个不可变长度的Data类型,只能够通过一次加载完成所有的数据
//把文件写入到内存当中
/*
NSString *path = @"/Users/renwenyi/Desktop/renwenyi.txt";
NSData *data = [NSData dataWithContentsOfFile:path];
NSLog(@"data的长度:%ld",data.length);
//把写入到内存中的文件,写入指定的位置
NSString *path2 = @"/Users/renwenyi/Desktop/newrenwenyi.txt";
BOOL isWriteSuccess = [data writeToFile:path2 atomically:YES];
if (isWriteSuccess) {
NSLog(@"写入成功");
}
else
{
NSLog(@"写入失败");
}
*/
//2:可变长度的Data类型NSMutableData
//当我们需要把多个NSData拼接成数据存储的时候,就要想到使用NSMutable这个类型
NSString *str1 = @"皇上驾到1次";
NSString *str2 = @"皇上驾到2次";
NSString *str3 = @"爱卿平身...";
NSMutableData *muData = [[NSMutableData alloc]init];
//下面是写入内存,相当于dataWithContents
NSData *d1 = [str1 dataUsingEncoding:NSUTF8StringEncoding];
NSData *d2 = [str2 dataUsingEncoding:NSUTF8StringEncoding];
NSData *d3 = [str3 dataUsingEncoding:NSUTF8StringEncoding];
//appendData 能够把NSData对象加入到 muData 中
[muData appendData:d1];
[muData appendData:d2];
[muData appendData:d3];
NSString *path = @"/Users/renwenyi/Desktop/haoren.txt";
//writeToFile是NSData的方法,但是NSMutable继承字NSData 所以可以调用,表示写入到指定目录下
BOOL isWriteSuccess = [muData writeToFile:path atomically:YES];
if (isWriteSuccess) {
NSLog(@"创建成功");
}
else
{
NSLog(@"创建失败");
}
}
return 0;
}