OC中文件的操作可以分为两类:
(1)文件本省的操作:创建、删除、移动、拷贝等
(2)文件内容的操作:读、写等
|| 读: 磁盘——>内存
|| 写:内存——>磁盘
要想学会OC中的文件操作,我们就要学会两个类:
NSFileManager(文件管理类)
NSFileHandle(文件句柄类)
一、NSFileManager
1、创建文件管理器单利对象
NSFileManager *fm = [NSFileManagerdefaultManager];
2、遍历目录下内容
//浅度遍历指定目录
NSError * __autoreleasing error =nil;
NSArray *ary = [fmcontentsOfDirectoryAtPath:@"PATH"error:&error];
//该方法若出错会创建一个NSError类型的对象,然后用传递过来的error指针指向该对象
if (error) {
NSLog(@"%@", error);
}
//深度遍历指定目录
NSArray *ary2 = [fmsubpathsOfDirectoryAtPath:PATHerror:nil];
NSArray *ary2 = [fm subpathsAtPath:PATH];
3、创建文件或者目录
//创建文件,若创建的文件已存在,则会覆盖
BOOL ret = [fm createFileAtPath:PATHcontents:nilattributes:nil];
//创建文件夹,若文件夹已经存在,则不会覆盖
/*
参数1:创建的目录
参数2:是否创建中间目录
参数3:要创建的目录的属性
参数4:出错处理
*/
ret = [fm createDirectoryAtPath:PATH2withIntermediateDirectories:YESattributes:nilerror:nil];
if (ret == YES) {
NSLog(@"目录创建成功");
} else {
NSLog(@"目录创建失败");
}
4、拷贝文件或者目录
//拷贝文件或目录
BOOL ret = [fm copyItemAtPath:SRCtoPath:DSTerror:nil];
if (ret == YES) {
NSLog(@"拷贝成功");
} else {
NSLog(@"拷贝失败");
}
5、移动文件或者目录
BOOL ret = [fm moveItemAtPath:SRCtoPath:DSTerror:nil];
if (ret == YES) {
NSLog(@"移动成功");
} else {
NSLog(@"移动失败");
}
6.删除文件或者目录
BOOL ret = [fm removeItemAtPath:PATHerror:nil];
7、获取文件属性
NSDictionary *attr = [fmattributesOfItemAtPath:PATH2error:nil];
8、判断文件是否存在
ret = [fm fileExistsAtPath:PATH2];
9、判断文件是否存在,是否是目录
BOOL isDir = NO;
ret = [fm fileExistsAtPath:PATH2isDirectory:&isDir];
二、NSFileHandle
1、打开文件方式(默认位置在文件的开头)
//已只读方式打开文件
NSFileHandle *fh = [NSFileHandlefileHandleForReadingAtPath:PATH];
//以只写方式打开文件
NSFileHandle *fh2 = [NSFileHandlefileHandleForWritingAtPath:PATH];
//以读写方式打开
NSFileHandle *fh3 = [NSFileHandlefileHandleForUpdatingAtPath:PATH];
2、从当前偏移量读到文件尾
NSData *data = [fhreadDataToEndOfFile];
3、读取制定长度的数据(单位是字节)
NSData *data = [fh readDataOfLength:5];
4、设置文件的偏移量(单位字节)
[fh seekToFileOffset:10];
5、设置文件偏移量之文件尾
[fh seekToEndOfFile];
6、将文件的长度设置为offset大小(截断文件)
[fh3 truncateFileAtOffset:20];
7、将数据写入到文件
[fh2 writeData:data];
练习题、:
编写一个程序,将一个目录下的文件分类管理
a、用每个文件的后缀创建对应全大写目录,将同类文件移动到对应的目录。
如:1.txt文件,创建TXT目录,将1.txt移动到该目录
b、将没有后缀的文件移动到Others目录
c、将目录移动到subDir目录中
#import "JYFileManager.h"
@implementation JYFileManager
{
NSMutableArray *_contents;
NSString *_path;
}
- (instancetype)initWithPath:(NSString *)path
{
if (self = [superinit]) {
_path = path;
_contents = [[NSMutableArrayalloc] init];
}
return self;
}
- (void)moveDirectory:(NSString *)name
{
NSFileManager *fm = [NSFileManagerdefaultManager];
//1、创建subDir目录
NSString *subDir = [_pathstringByAppendingPathComponent:@"subDir"];
[fm createDirectoryAtPath:subDirwithIntermediateDirectories:YESattributes:nilerror:nil];
//2、拼接原路径和目标路径
NSString *src = [_pathstringByAppendingPathComponent:name];
NSString *dst = [subDirstringByAppendingPathComponent:name];
[fm moveItemAtPath:srctoPath:dst error:nil];
}
- (void)moveFile:(NSString *)name
{
NSArray *ary = [namecomponentsSeparatedByString:@"."];
NSFileManager *fm = [NSFileManagerdefaultManager];
if (ary.count ==1) {
//没有后缀
NSString *others = [_pathstringByAppendingPathComponent:@"Others"];
[fm createDirectoryAtPath:otherswithIntermediateDirectories:YESattributes:nilerror:nil];
NSString *src = [_pathstringByAppendingPathComponent:name];
NSString *dst = [others stringByAppendingPathComponent:name];
[fmmoveItemAtPath:src toPath:dst error:nil];
}else {
//有后缀
NSString *dir = [[ary lastObject] uppercaseString];
NSString *DIR = [_pathstringByAppendingPathComponent:dir];
[fm createDirectoryAtPath:DIRwithIntermediateDirectories:YESattributes:nilerror:nil];
NSString *src = [_pathstringByAppendingPathComponent:name];
NSString *dst = [DIRstringByAppendingPathComponent:name];
[fmmoveItemAtPath:src toPath:dst error:nil];
}
}
- (void)archiveFileAtPath
{
//1、创建文件管理类的对象
NSFileManager *fm = [NSFileManagerdefaultManager];
//2、浅度遍历,保存到数组
_contents.array = [fmcontentsOfDirectoryAtPath:_patherror:nil];
//3、循环遍历数组
for (NSString *strin _contents) {
unichar ch = [str characterAtIndex:0];
if (ch == '.') {
continue;
}
//NSString *path = [_path stringByAppendingFormat:@"/%@", str];
NSString *path = [_pathstringByAppendingPathComponent:str];
//判断是否是目录
BOOL isDir = NO;
[fmfileExistsAtPath:path isDirectory:&isDir];
if (isDir == YES) {
//4-1、是目录
[selfmoveDirectory:str];
}else {
//4-2、是文件
[selfmoveFile:str];
}
}
}
+ (void)archiveFileAtPath:(NSString *)path
{
NSFileManager *fm = [NSFileManagerdefaultManager];
BOOL isDir = NO;
BOOL isExist = [fm fileExistsAtPath:path isDirectory:&isDir];
if (isExist == NO) {
NSLog(@"有木有搞错,不存在咋整啊");
return;
}else {
if (isDir == NO) {
NSLog(@"知不知道什么是目录");
return;
}
}
//若是一个目录则执行以下代码
JYFileManager *myFm = [[JYFileManageralloc] initWithPath:path];
[myFm archiveFileAtPath];
}
@end
======main====
#define PATH @"/Users/qianfeng001/Desktop/test"
int main(int argc,const char * argv[]) {
@autoreleasepool {
[JYFileManagerarchiveFileAtPath:PATH];
}
return 0;
}
========运行前=========
========运行后=========