功能需求: 公司项目要实现电子书连载功能,比如一开始只有前2章,后面更新了3-5章的话,需要把后三章的内容添加到原来的文件中,相应的目录也要修改。(以下拿epub格式的电子书为例.PS:epub实际上就是压缩文件)
思路:可以把现在的epub和新增的epub解压出来、把新的epub里面同名的文件覆盖掉旧的、新增的复制过去,再打包成epub。
这样操作的话,效率不高也比较消耗内存。所以去网上找了下有没有效率不错的第三方。
objective-zip github地址:https://github.com/gianlucabertani/Objective-Zip
这个库可以实现压缩文件,解压文件,替换压缩文件里面的内容功能,目前用到替换压缩文件内容功能。实现代码如下:
// 获取沙盒中的路径获取document目录
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSLog(@"%@",doc);
//获取epub文件路径
NSString * path = [doc stringByAppendingPathComponent:@"template2.epub"];
/*初始化OZZipFile 第一个参数为要添加内容的epub文件路径,第二个参数有三种类型
压缩文件:OZZipFileModeUnzip
清除原来内容之后再添加内容:OZZipFileModeCreate
在原来文件内容的基础上添加内容OZZipFileModeAppend
*/
OZZipFile * zipFile = [[OZZipFile alloc]initWithFileName:path mode:OZZipFileModeAppend];
/**
* 初始化OZZipWriteStream 第一个参数为要添加内容的文件路径(该路径表示压缩文件里面的路径) 第二个参数为压缩等级
*/
OZZipWriteStream *stream = [zipFile writeFileInZipWithName:@"OEBPS/Text/Section0001.xhtml" compressionLevel:OZZipCompressionLevelBest];
//初始化要添加的内容
NSString * replacePath = [[NSBundle mainBundle]pathForResource:@"chapter0.xhtml" ofType:nil];
NSData * data = [NSData dataWithContentsOfFile:replacePath];
NSError * error = nil;
//往指定路径文件添加内容
[stream writeData:data error:&error];
if(error)
{
NSLog(@"%@",error);
}
//写入完成
[stream finishedWriting];
//关闭文件
[zipFile close];
注意事项:mainbundel里面的文件内容是允许修改的,所以测试的时候,不要把文件放入mainbundle路径下,应该放在沙盒路径下。
epub文件结构如下:
圈中部分为要修改的文件