![](https://img.haomeiwen.com/i3807682/e4ce6b21de3e95ec.png)
需求:
1、将视频或图片分段读取并上传服务器。
2、读取服务器返回的分段数据并保存在本地
首当其冲的想到了NSFileHandle。这里就来唠嗑唠嗑。
这里先分享一个Demo(通过NSFileHandle实现分段上传)
运行demo,
![](https://img.haomeiwen.com/i3807682/c7fa4f53739c3e83.gif)
按钮:点击读图片。作用是分段读取图片,然后保存数据。
按钮:拼接第一种。作用是将分段的数据按一定的规则拼接完整然后读取图片数据并显示在界面上。想了解这一部分可以查看iOS基础之字节处理
一、创建读文件句柄
创建读文件句柄,获取文件大小
//获取文件路径
NSString *path= [[NSBundle mainBundle] pathForResource:@"ceshi" ofType:@"jpeg"];
//创建读文件的句柄
self.readHandle = [NSFileHandle fileHandleForReadingAtPath:path];
//用来记录偏移量
self.offset = 0;
//获取文件大小
unsigned long long totalRet = [self.readHandle seekToEndOfFile];//返回文件大小
二、分段读取文件
因为是分段读取,每一次读取指定大小,如果不是最后一次
//将句柄移动到已读取内容的最后
[self.readHandle seekToFileOffset:self.offset];
//读取指定大小的内容(PackgeSize)
data = [self.readHandle readDataOfLength:PackgeSize];
如果是最后一次
//将句柄移动到已读取内容的最后
[self.readHandle seekToFileOffset:self.offset];
//从指定位置读到文件最后
data = [self.readHandle readDataToEndOfFile];
//关闭读句柄
[self.readHandle closeFile];
记住一定要closeFile
三、创建写文件句柄并写入文件
//文件存放路径:目标Document
NSString * docpath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *destFile =[docpath stringByAppendingPathComponent:fileName];
//destFile路径上创建文件
[[NSFileManager defaultManager] createFileAtPath:destFile contents:nil attributes:nil];
//创建写文件的句柄
self.descHandle = [NSFileHandle fileHandleForWritingAtPath:destFile];
//开始写入
//偏移量设置为目标文件的最后,要不然会覆盖原来的内容
[self.descHandle seekToEndOfFile];
//写数据
[self.descHandle writeData:data];
self.offset += data.length;
//关闭句柄
[self.descHandle closeFile];
同样记住一定要closeFile
四、简单实现文件复制
4.1 创建读和写的句柄
//待复制的文件
NSString *path= [[NSBundle mainBundle] pathForResource:@"ceshi" ofType:@"jpeg"];
//创建读文件的句柄
self.readHandle = [NSFileHandle fileHandleForReadingAtPath:path];//读到内存
//目标路径
NSString * docpath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *destFile =[docpath stringByAppendingPathComponent:fileName];
//创建文件
[[NSFileManager defaultManager] createFileAtPath:destFile contents:nil attributes:nil];
//创建写文件的句柄
self.descHandle = [NSFileHandle fileHandleForWritingAtPath:destFile];
4.2 复制
因为是分段读取,每一次读取指定大小,如果不是最后一次
//将句柄移动到已读取内容的最后
[self.readHandle seekToFileOffset:self.offset];
//读取指定大小的内容(PackgeSize)
data = [self.readHandle readDataOfLength:PackgeSize];
//偏移量设置为目标文件的最后,要不然会覆盖原来的内容
[self.descHandle seekToEndOfFile];
//写数据
[self.descHandle writeData: data];
如果是最后一次
//将句柄移动到已读取内容的最后
[self.readHandle seekToFileOffset:self.offset];
//从指定位置读到文件最后
data = [self.readHandle readDataToEndOfFile];
//偏移量设置为目标文件的最后,要不然会覆盖原来的内容
[self.descHandle seekToEndOfFile];
//写数据
[self.descHandle writeData: data];
//关闭句柄
[self.descHandle closeFile];
[self.readHandle closeFile];
如果觉得可以,可以下载Demo详细了解,并实际操作试一下。
网友评论