(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提取文件属性里面的文件大小。
时间: 2024-12-30 00:41:37