首页 > 代码库 > 【OC学习-25】实例:一次复制小文件和分次复制大文件——巩固文件的操作方法

【OC学习-25】实例:一次复制小文件和分次复制大文件——巩固文件的操作方法

(1)复制一个小文件,可以一次性把从源文件里读取出来的数据全都写入到目标文件中,这样就完成复制

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        //创建一个源文件路径和目标文件路径
        NSString *homePath=NSHomeDirectory();
        NSString *oriFilePath=[homePath stringByAppendingPathComponent:@"economist-20140830.pdf"];
        NSString *finFilePath=[homePath stringByAppendingPathComponent:@"economist-copy.pdf"];
        //利用fileManager去创建目标文件(源文件已有不必创建)
        NSFileManager *fileManager=[NSFileManager defaultManager];
        [fileManager createFileAtPath:finFilePath contents:nil attributes:nil];
        //打开源文件和目标文件
        NSFileHandle *oriFile=[NSFileHandle fileHandleForReadingAtPath:oriFilePath];
        NSFileHandle *finFile=[NSFileHandle fileHandleForWritingAtPath:finFilePath];
        //把源文件一次性读取出来的数据写入到目标文件中
        [finFile writeData:[oriFile readDataToEndOfFile]];
        //关闭文件
        [oriFile closeFile];
        [finFile closeFile];
    }
    return 0;
}

结果:


(2)分次复制大文件,每次复制500字节,用到循环每次读取500,并用到判断如果末尾一次不足500字节则全部读取

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        //创建一个源文件路径和目标文件路径
        NSString *homePath=NSHomeDirectory();
        NSString *oriFilePath=[homePath stringByAppendingPathComponent:@"economist-20140830.pdf"];
        NSString *finFilePath=[homePath stringByAppendingPathComponent:@"economist-hello.pdf"];
        //利用fileManager去创建目标文件(源文件已有不必创建)
        NSFileManager *fileManager=[NSFileManager defaultManager];
        [fileManager createFileAtPath:finFilePath contents:nil attributes:nil];
        //打开源文件和目标文件
        NSFileHandle *oriFile=[NSFileHandle fileHandleForReadingAtPath:oriFilePath];
        NSFileHandle *finFile=[NSFileHandle fileHandleForWritingAtPath:finFilePath];
        //获取源文件大小,利用fileManager先获取文件属性,然后提取属性里面的文件大小,属性是一个字典,然后再把文件大小转化成整形
        NSDictionary *oriAttr=[fileManager attributesOfItemAtPath:oriFilePath error:nil];
        NSNumber *fileSize0=[oriAttr objectForKey:NSFileSize];
        NSInteger fileSize=[fileSize0 longValue];
        //先设定已读文件大小为0,和一个while判断值
        NSInteger fileReadSize=0;
        BOOL isEnd=YES;
        while (isEnd) {
            NSInteger sublength=fileSize-fileReadSize;//判断还有多少未读
            NSData *data=nil;//先设定个空数据
            if (sublength<500) { //如果未读的数据少于500字节那么全都读取出来,并结束while循环
                isEnd=NO;
                data=[oriFile readDataToEndOfFile];
            }else{
                data=[oriFile readDataOfLength:500];//如果未读的大于500字节,那么读取500字节
                fileReadSize+=500;//把已读的加上500字节
                [oriFile seekToFileOffset:fileReadSize];//把光标定位在已读的末尾
            }
            [finFile writeData:data];//把以上存在data中得数据写入到目标文件中
        }
        //关闭文件
        [oriFile closeFile];
        [finFile closeFile];
    }
    return 0;
}

结果:


总结:

a:fileManager功能强大,可以很自如地操作文件;

b:利用fileManager和FileHandle来操作文件更得心应手,注意两者的优势,比如读取文件大小,可以利用fileHandle的一个操作方法把数据都提取出来测量数据大小,但对于大文件相当于把文件都读取一遍,不可取。所以可以用fileManager提取文件属性里面的文件大小。

【OC学习-25】实例:一次复制小文件和分次复制大文件——巩固文件的操作方法