6-17文件管理
1.文件管理器:
作用:要想对文件进行管理,第一步必须要有文件管理器
注意:一个程序中,只能有一个文件管理器,它可以对多个文件进行管理。
------------------------------------------------------------------------------------
文件管理器的使用:
1)创建文件管理器:
NSFileManager * fm = [NSFileManager defaultManager];
------------------------------------------------------------------------------------
2)查看目录下的内容1
方法一:浅度遍历显示目录下的内容
主要语句:
NSArray * array = [fm contentsOfDirectoryAtPath:@"/Users/qianfeng/Desktop1" error:&error];
例如:
NSError * error;//错误信息
NSArray * array = [fm contentsOfDirectoryAtPath:@"/Users/qianfeng/Desktop1" error:&error];
if (!error)
{
NSLog(@"array = %@",array);
NSLog(@"成功了");
}
else
{
NSLog(@"失败了\nerror = %@",error);
}
函数说明:
返回值:查看成功把目录下内容放入数组中
第一个参数:目录的路径
第二个参数:错误信息:显示成功时error为nil;失败时error为错误信息的地址
方法二:深度遍历显示目录下的内容
主要语句:
array = [fm subpathsOfDirectoryAtPath:[NSString stringWithUTF8String:argv[2]] error:&error];
NSArray * array ;
NSError * error;
NSFileManager * fm = [NSFileManager defaultManager];
array = [fm subpathsOfDirectoryAtPath:路径 error:&error];
//深度遍历目录下的内容
if(!error)
{
NSLog(@"array = %@",array);
}
else
{
NSLog(@"参数输入错误!");
}
------------------------------------------------------------------------------------
3)创建一个文件夹
主要函数:
BOOL ret = [fm createDirectoryAtPath:@"/Users/Rebecca/Desktop/1310test" withIntermediateDirectories:YES attributes:nil error:nil];
函数说明:
返回值:创建成功返回YES
第二个参数:当目标目录路径存在,YES代表创建、NO代表不创建;
当目标目录路径不存在,YES和NO都代表创建;
当需要创建的目录之前的路径只要有一个不存在的时候,YES代表创建、NO代表不创建;
第三个参数:属性或者权限(nil代表默认属性)
第四个参数:代表错误信息,如果不想查看错误信息,传入nil
例子:
NSFileManager * fm = [NSFileManager defaultManager];
BOOL ret = [fm createDirectoryAtPath:@"/Users/Rebecca/Desktop/1310test" withIntermediateDirectories:YES attributes:nil error:nil];
if (ret)
{
NSLog(@"创建成功了");
}
else
{
NSLog(@"创建失败了");
}
------------------------------------------------------------------------------------
4)创建一个文件
主要函数:
//判断文件是否存在
BOOL retFile = [fm fileExistsAtPath:@"/Users/qianfeng/Desktop/222.c"];
//创建文件
BOOL ret = [fm createFileAtPath:@"/Users/Rebecca/Desktop/111.c" contents:nil attributes:nil];
函数说明:
创建文件函数的第二个参数:代表文件内容,nil代表空文件
当文件存在时,会替换
例子:
NSFileManager * fm = [NSFileManager defaultManager];
BOOL retFile = [fm fileExistsAtPath:@"/Users/Rebecca/Desktop/111.c"];
if (retFile==YES)
{1
NSLog(@"文件已存在");
}
else
{
BOOL ret = [fm createFileAtPath:@"/Users/Rebecca/Desktop/111.c" contents:nil attributes:nil];
if (ret)
{
NSLog(@"成功了");
}
else
{
NSLog(@"失败了");
exit(1);
}
其他知识点补充:
return 和 exit的区别:
return:代表当前函数的返回,结束当前函数
exit:代表结束当前进程(单进程的话,会结束整个程序)
------------------------------------------------------------------------------------
5)获取文件属性
例子:
//获取文件属性,并将属性放入字典中。
NSDictionary * fileDict = [fm attributesOfFileSystemForPath:@"Users/Rebecca/Desktop/111.c" error:nil];
//获取文件大小(方法一)
unsigned long long size = [fileDict fileSize];
//获取文件大小(方法二)
[fileDict objectForKey:@"NSSileSize"];
------------------------------------------------------------------------------------
6)拷贝文件or目录
主要函数:
BOOL retCp = [fm copyItemAtPath:@"/Users/Rebecca/Desktop/111.c" toPath:@"/Users/Rebecca/Desktop/111_bak.c" error:nil];
函数说明:
第一个参数:需要拷贝的文件or目录的路径名(需要拷贝的文件or目录必须存在)
第二个参数:拷贝到的位置+拷贝后文件or文件夹的名称。
第三个参数:错误信息
例子:
NSFileManager * fm = [NSFileManager defaultManager];
BOOL retCp = [fm copyItemAtPath:@"/Users/Rebecca/Desktop/111.c" toPath:@"/Users/Rebecca/Desktop/111_bak.c" error:nil];
if (retCp == YES)
{
NSLog(@"拷贝成功");
}
else
{
NSLog(@"拷贝失败");
}
------------------------------------------------------------------------------------
7)移动文件or目录
主要函数:
BOOL ret =[fm moveItemAtPath:@"/Users/Rebecca/Desktop/111.c" toPath:@"/Users/Rebecca/111_bak.c" error:nil];
函数说明:
保证目标文件名要写完整,不能只写路径,不命名
例子:
NSFileManager * fm = [NSFileManager defaultManager];
BOOL ret =[fm moveItemAtPath:@"/Users/Rebecca/Desktop/111.c" toPath:@"/Users/Rebecca/111_bak.c" error:nil];
if (ret)
{
NSLog(@"移动成功");
}
else
{
NSLog(@"移动失败");
}
------------------------------------------------------------------------------------
8)删除文件or目录
主要函数:
[fm removeItemAtPath:@"Users/Rebecca/Desktop/111.c" error:nil];
函数说明:
删除函数谨慎使用,它不会将删除内容放入废纸篓中,而是直接删除,找不回来。
********************************************************************************************
2.文件的读写
1)文件缓冲区
说明:文件的读写操作,需要通过文件的缓冲区完成。OC文件缓冲区存储的数据类型是:NSData类型
转 换
OC字符串<-------->文件缓冲区
写入过程:先将OC字符串转换为NSData类型,即:将字符串放入文件缓冲区中
例子:
NSString * str = @"Welcome to Beijing";
NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
读出过程:把文件缓冲区的内容读成字符串
例子:
NSString * ptr =[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",ptr);
------------------------------------------------------------------------------------
2)文件句柄
说明:a.对一个文件进行读写操作,要创建文件句柄,来打开文件。
b.OC的创建文件只能由文件管理器操作,打开文件不不会创建文件
以下三种方法打开失败时均返回nil
方法一:
//以只读的方式打开一个文件
NSFileHandle *fh = [NSFileHandle fileHandleForReadingAtPath:@"此处填写文件路径"];
方法二:
//以只写方式打开一个文件
NSFileHandle *fh = [NSFileHandle fileHandleForWritingAtPath:@"此处填写文件路径"];
方法二:
//以读写方式打开一个文件
NSFileHandle *fh = [NSFileHandle fileHandleForUpdatingAtPath:@"此处填写文件路径"];
----------------------------------------------------------------------------------------------------------------------
3)关于文件偏移量
说明:a.打开之后,文件偏移量为0,即:在文件首。
b.同一个程序中,每读一次文件偏移量都会后移。
移动文件偏移量:
方法一:
[fh seekToFileOffset:0];//为0时,即:把文件偏移量定位到文件首
方法二:
[fh seekToEndOfFile];//把文件偏移量定位到文件尾;
------------------------------------------------------------------------------------
4)文件的读写操作
读操作:
方法一:
NSData * data = [fh readDataOfLength:10];//每次读10个字节长度;//每读一次文件偏移量都会后移
NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
方法二:
//从当前位置读到文件尾
NSData * data = [fh readDataToEndOfFile];
NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
该方法的使用说明:
a.只有当剩余未读字节数比较少的时候,才使用这个函数。
b.一般不使用这个函数让从文件首读到文件尾,这样的会太占内存,影响程序执行效率;即使有要求要读全文件,一般也是一段一段逐渐去读,不用此函数。
写操作:
例子:
//向文件中追加数据
NSFileHandle * fh = [NSFileHandle fileHandleForUpdatingAtPath:@"/Users/Rebecca/Desktop/test.c"];
//将文件偏移量定位到文件尾,然后再填入内容;否则的话,会覆盖数据来写入。
[fh seekToEndOfFile];
NSString * str = @"Welcome to Beijing";
NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
[fh writeData:data];