文章目录
主要的类
NSFileManager:文件管理类,当我们要去创建目录,或者操作目录中某些文件的时候,或者想查看某个目录或者文件的属性。
NSFileHandle:如果操作对象是某个文件,并在里面进行文本的编辑。
NSFileManager
创建文件管理类单例对象:
NSFileManager *fileManger=[NSFileManager defaultManager];
创建目录
:第一个参数:文件夹目录
第二个参数:是否附带中间路径,也就是在目录之前可能生成一些中间目录出来,YES附带,NO不附带,如果要在第一个参数目录后面连续添加目录,则必须为YES.比如:/Users/chao/Desktop/FileOperation/Test/Test1
第三个参数:目录属性,一般用系统默认提供给我们的,一般传nil
第四个参数:如果目录创建失败,返回为什么创建失败了,以便于我们去完成一些异常操作。是一个二级指针。
返回是一个BOOL值,也能帮助我们判断路径是创建成功了还是失败了。
将文件夹拖动到xcode界面,会在文档里自动生成该文件夹的路径。
NSError *error=nil;
BOOL ret=[fileManager createDirectoryAtPath:@"/Users/chao/Desktop/FileOperation/Test" withIntermediateDirectories:NO attributes:nil error:&error];
if(ret){
NSLog(@"目录创建成功");
}else{
NSLog(@"目录创建失败,reason:%@",error);
}
定义带参宏
为了后续操作路径方便,对多次使用的同一个路径,可以写在一个宏定义当中。首先确定变量是什么,不变的量是什么。父路径是不变的,可变的是子路径,到底是创建目录呢,还是创建文件。
使用的时候,用到字符串拼接,或者格式化字符串的方法。
#import <Foundation/Foundation.h>
#define kPathAtFileOperation(subpath) \
[NSString stringWithFormat:@"/Users/chao/Desktop/FileOperation/%@",subpatch]
//main
NSError *error=nil;
BOOL ret=[fileManager createDirectoryAtPath:kPathAtFileOperation(@"test") withIntermediateDirectories:NO attributes:nil error:&error];
if(ret){
NSLog(@"目录创建成功");
}else{
NSLog(@"目录创建失败,reason:%@",error);
}
附带中间路径
test1和test1-1之前都没有生成过,此时第二个参数要写成YES,如果写成NO的话,程序不会识别中间的test1。
BOOL ret=[fileManager createDirectoryAtPath:kPathAtFileOperation(@"test1/test1-1") withIntermediateDirectories:YES attributes:nil error:&error];
创建文件
文件路径肯定是带 .文件类型 的。
contents参数接的是文件的内容,NSData类型,如果传nil,那么文件内容就是空的。
当多次创建相同的文件时,会进行覆盖操作。
NSString *string=@"文件操作";
NSData *data=[string dataUsingEncoding:NSUTF8StringEncoding];
ret=[fileManager createFileAtPath:kPathAtFileOperation(@"test.txt") contents:data attributes:nil];
路径遍历
浅度遍历
第一个参数:要遍历的路径。返回结果是NSArray类型的,会把目录下的所有内容全部列举出来。隐藏文件一般都是.开头的
NSArray *contents=[fileManager contentsOfDirectoryAtPath:@"/Users/chao/Desktop/FileOperation" error:nil];
结果:
“.DS_Store”,
test,
“test.txt”,
test1
深度遍历
contents=[fileManager subpathsOfDirectoryAtPath:@"/Users/chao/Desktop/FileOperation" error:nil];
结果:
“.DS_Store”,
test,
“test.txt”,
test1,
“test1/.DS_Store”,
“test1/test1-1”
浅度遍历的结果,在深度遍历里都可以找到。文件结构中所有的节点都会扫描一遍。所以浅度效率要高一些,深度遍历在路径复杂的时候,耗时会久一些。
文件移动
[fileManager moveItemAtPath:kPathAtFileOperation(@"test.txt") toPath:kPathAtFileOperation(@"test/test.txt") error:nil];
复制操作
[fileManager copyItemAtPath:kPathAtFileOperation(@"test/test.txt") toPath:@"/Users/chao/Desktop/FileOperation" error:nil];
删除操作
[fileManager removeItemAtPath:kPathAtFileOperation(@"test.txt") error:nil];
查看属性
返回结果是字典NSDictionary类
NSDictionary *dictionary=[fileManager attributesOfItemAtPath:kPathAtFileOperation(@"test/test.txt") error:nil];
查看文件是否在路径下存在
if(fileManager fileExistsAtPath:kPathAtFileOperation(@"test/test.txt")){
NSLog(@"YES");
}else{
NSLog(@"NO");
}
NSFileHandle
打开文件
只读,不可写:
NSFileHandle * = [NSFileHandle fileHandleForReadingAtPath:"/Users/chao/Desktop/FileOperation/test/test.txt"]; NSLog(@"%@",[fileHandle readDataToEndOffFile]);//从光标的位置读到文件末尾,如果不去操作光标位置,那么光标默认是在文件的最前面。读出的是二进制数据,要转换一下才能看到有意义的字符串
只写,不可读:
NSFileHandle * = [NSFileHandle fileHandleForWritingAtPath:"/Users/chao/Desktop/FileOperation/test/test.txt"];
可读,可写:
NSFileHandle * = [NSFileHandle fileHandleForUpdatingAtPath:"/Users/chao/Desktop/FileOperation/test/test.txt"];
读取文件
NSLog(@"%@",[fileHandle readDataToEndOffFile]);
NSLog(@"%@",[fileHandle readDataToEndOffFile]);
第二次输出为空,因为每次去调取读取文件相关方法的时候,都会导致光标的移动。
读取指定长度的数据:
[fileHandle readDataOfLength:1];
写入数据
写入的是NSData数据。
string的dataUsingEncoding方法,字符串转NSData
NSString *string=@"baidu.com";
[fileHandle writeData:[string dataUsingEncoding:NSUTF8StringEncoding]];
文件数据的同步
在进行了文件数据的修改后,可以手动调用synchronizeFile方法,来完成数据的同步,这是很常用的。
[fileHandle synchronizeFile];
光标移动
offset是光标的偏移量,当offset为0,光标就会设置到文件开头。
[fileHandle seekToFileOffset:0];
关闭文件
每次打开文件,操作完成后,必须关闭文件。关闭之后就不能继续进行操作了。
[NSFileHandle closeFile];