iOS文件拷贝实现

来源:互联网 发布:表白网站制作软件 编辑:程序博客网 时间:2024/06/06 06:46
//拷贝小文件- (IBAction)copyNormalFile:(id)sender {    //需求:/Documents/source.txt -> 拷贝到/Docuements/target.txt    //1.两个文件所在的路径    NSString *sourcePath = [self.documentsPath stringByAppendingPathComponent:@"source.txt"];    NSString *targetPath = [self.documentsPath stringByAppendingPathComponent:@"target.txt"];    //2.创建两个空的文件    NSString *sourceContent = @"源文件的测试内容。。。";    [[NSFileManager defaultManager] createFileAtPath:sourcePath contents:[sourceContent dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];    [[NSFileManager defaultManager] createFileAtPath:targetPath contents:nil attributes:nil];    //3.使用NSFileHandle写入source.txt内容    //3.1 创建NSFileHandle对象,指定哪个文件,并且指定目的(读或者写)    NSFileHandle *sourceHandle = [NSFileHandle fileHandleForReadingAtPath:sourcePath];    NSFileHandle *targetHandle = [NSFileHandle fileHandleForWritingAtPath:targetPath];    //4.读取source.txt所有数据    NSData *readData = [sourceHandle readDataToEndOfFile];    //5.在写入target.txt    [targetHandle writeData:readData];    //测试:在给定要写入的数据    NSString *writeContent = @"新写入的数据";    NSData *writeDataAgain = [writeContent dataUsingEncoding:NSUTF8StringEncoding];    [targetHandle writeData:writeDataAgain];}//拷贝大文件- (IBAction)copyBigFile:(id)sender {    //准备:把大的文件的放在/Documents/source.pdf    //需求:大的source.pdf的内容分批地拷贝到target.pdf    //1.获取两个文件的路径    NSString *sourcePath = [self.documentsPath stringByAppendingPathComponent:@"source.pdf"];    NSString *targetPath = [self.documentsPath stringByAppendingPathComponent:@"target2.pdf"];    //2.创建空的target.pdf文件    [[NSFileManager defaultManager] createFileAtPath:targetPath contents:nil attributes:nil];    //3.创建两个NSFileHandle对象    NSFileHandle *sourceHandle = [NSFileHandle fileHandleForReadingAtPath:sourcePath];    NSFileHandle *targetHandle = [NSFileHandle fileHandleForWritingAtPath:targetPath];    //4.while循环分批拷贝    //设定每次从源文件读取5000bytes    int dataSizePerTimes = 5000;//    //源文件的总大小(方式一)//    NSDictionary *sourceFileDic = [[NSFileManager defaultManager] attributesOfItemAtPath:sourcePath error:nil];//    NSLog(@"源文件pdf的属性字典:%@", sourceFileDic);//    //单位:bytes//    NSNumber *fileSize = [sourceFileDic objectForKey:NSFileSize];//    int fileTotalSize = [fileSize intValue];    /*源文件的总大小(方式二)      坑:如下的方法会把源文件handle对象直接指向最后     */    unsigned long long fileTotalSize = [sourceHandle seekToEndOfFile];    //把挪动到最后的文件指针挪到最前面(相对于文件的开头的偏移量offset)    [sourceHandle seekToFileOffset:0];    //已经读取源文件的总大小    int readFileSize = 0;    //while循环    while (1) {        //计算剩余没有读取的数据的大小        int leftSize = fileTotalSize - readFileSize;        //情况一:剩余不足5000bytes        if (leftSize < dataSizePerTimes) {            //直接读取剩下的所有数据            NSData *leftData = [sourceHandle readDataToEndOfFile];            //写入目标文件            [targetHandle writeData:leftData];            //跳出循环            break;        } else {            //情况二:每次读取5000bytes            NSData *data = [sourceHandle readDataOfLength:dataSizePerTimes];            //写入目标文件            [targetHandle writeData:data];            //更新已经读取的数据大小            readFileSize += dataSizePerTimes;        }    }    //收尾工作(关闭指向)    [sourceHandle closeFile];    [targetHandle closeFile];}
0 0
原创粉丝点击