(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提取文件属性里面的文件大小。