您的位置:首页 > 其它

OC学习--文件操作

2015-06-16 20:53 459 查看
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;
}

========运行前=========



========运行后=========



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  OC