关于
UnrarKit 的目的是为 Mac 和 iOS 应用程序提供易于使用的 RAR 文件只读操作。目前基于 UnRAR 库 的 5.8.1 版本。
项目包括主项目、单元测试以及一个基本的 iOS 示例项目,演示如何使用该库。要查看所有这些,请打开主工作空间文件。
我始终欢迎改进,请提交您的 pull 请求,或 创建问题 由他人来实现。
安装
UnrarKit 支持现有 CocoaPods 和 Carthage。由于 CocoaPods 不支持动态框架目标(截至 v0.39.0 版本),因此在这种情况下,请使用 Carthage。
Cartfile
github "abbeycode/UnrarKit"
Podfile
pod "UnrarKit"
示例用法
NSError *archiveError = nil;
URKArchive *archive = [[URKArchive alloc] initWithPath:@"An Archive.rar" error:&archiveError];
NSError *error = nil;
列出归档中的文件名
NSArray<String*> *filesInArchive = [archive listFilenames:&error];
for (NSString *name in filesInArchive) {
NSLog(@"Archived file: %@", name);
}
列出归档中的文件详情
NSArray<URKFileInfo*> *fileInfosInArchive = [archive listFileInfo:&error];
for (URKFileInfo *info in fileInfosInArchive) {
NSLog(@"Archive name: %@ | File name: %@ | Size: %lld", info.archiveName, info.filename, info.uncompressedSize);
}
处理密码
NSArray<URKFileInfo*> *fileInfosInArchive = [archive listFileInfo:&error];
if (archive.isPasswordProtected) {
NSString *givenPassword = // prompt user
archive.password = givenPassword
}
// You can now extract the files
将文件提取到目录
BOOL extractFilesSuccessful = [archive extractFilesTo:@"some/directory"
overWrite:NO
error:&error];
将文件提取到内存
NSData *extractedData = [archive extractDataFromFile:@"a file in the archive.jpg"
error:&error];
流式传输文件
对于大文件,您可能不希望一次性将全部内容加载到内存中。您可以一次处理一个“块”,如下所示
BOOL success = [archive extractBufferedDataFromFile:@"a file in the archive.jpg"
error:&error
action:
^(NSData *dataChunk, CGFloat percentDecompressed) {
NSLog(@"Decompressed: %f%%", percentDecompressed);
// Do something with the NSData chunk
}];
进度报告
以下方法支持 NSProgress
和 NSProgressReporting
将文件提取到:覆盖:错误
提取数据:错误
从文件中提取数据:错误
对存档中的文件执行:错误
对存档中的数据执行:错误
从文件中提取缓冲数据:错误:操作
NSProgress
层次结构
使用隐式 您可以创建自己的 NSProgress
实例,并使用 KVO 观察 fractionCompleted
属性以监视进度,如下所示:
static void *ExtractDataContext = &ExtractDataContext;
URKArchive *archive = [[URKArchive alloc] initWithURL:aFileURL error:nil];
NSProgress *extractDataProgress = [NSProgress progressWithTotalUnitCount:1];
[extractDataProgress becomeCurrentWithPendingUnitCount:1];
NSString *observedSelector = NSStringFromSelector(@selector(fractionCompleted));
[extractDataProgress addObserver:self
forKeyPath:observedSelector
options:NSKeyValueObservingOptionInitial
context:ExtractDataContext];
NSError *extractError = nil;
NSData *data = [archive extractDataFromFile:firstFile error:&extractError];
[extractDataProgress resignCurrent];
[extractDataProgress removeObserver:self forKeyPath:observedSelector];
NSProgress
实例
使用自己的显式 如果您没有 NSProgress
实例的层次结构,或者您想在 extractFilesTo:overwrite:error:
期间观察更多进度更新详情,您可以创建自己的 NSProgress
实例,并将 URKArchive
实例的 progress
属性设置为,如下所示:
static void *ExtractFilesContext = &ExtractFilesContext;
URKArchive *archive = [[URKArchive alloc] initWithURL:aFileURL error:nil];
NSProgress *extractFilesProgress = [NSProgress progressWithTotalUnitCount:1];
archive.progress = extractFilesProgress;
NSString *observedSelector = NSStringFromSelector(@selector(localizedDescription));
[self.descriptionsReported removeAllObjects];
[extractFilesProgress addObserver:self
forKeyPath:observedSelector
options:NSKeyValueObservingOptionInitial
context:ExtractFilesContext];
NSError *extractError = nil;
BOOL success = [archive extractFilesTo:extractURL.path
overwrite:NO
error:&extractError];
[extractFilesProgress removeObserver:self forKeyPath:observedSelector];
NSProgress
取消
使用 使用上述任一方法,您可以调用 [progress cancel]
来停止正在进行的操作。它会导致操作失败,返回 nil
或 NO
(根据返回类型,并提供一个带有错误代码 URKErrorCodeUserCancelled
的错误)。
说明
要打开 Xcode,请使用包含其他项目的 UnrarKit.xcworkspace 文件。
文档
项目的完整文档可在 CocoaDocs 上找到。
日志记录
对于2016年及以后的所有操作系统版本(macOS 10.12, iOS 10, tvOS 10, watchOS 3),UnzipKit使用新的统一日志框架进行日志记录和活动跟踪。您可以在信息或调试级别查看消息,以查看UnzipKit的工作细节,并使用活动跟踪帮助定位引起特定错误的代码路径。
作为后备方案,在较旧的操作系统上使用常规的NSLog
,所有消息都记录在相同级别。
当调试自己的代码时,如果您想减少UnrarKit框架的详细程度,可以运行以下命令
sudo log config --mode "level:default" --subsystem com.abbey-code.UnrarKit
可用的级别,按照日志详细程度的递增顺序是 default
、info
、debug
,其中debug
是默认值。
日志记录指南
这些都是关于如何分类和编写活动及日志消息的一般规则。它们是在第一轮日志消息被编写之后编写的,因此可能存在一些不一致(如错误的日志级别)。如果您认为您发现了其中一个,请打开一个问题或拉取请求!
日志记录
日志消息应遵循以下约定。
- 日志消息没有最终标点符号(如这些列表项)
- 指出即将调用C函数,而不是更高层的UnrarKit或Cocoa方法的消息以"..."结尾,因为这些方法不会记录它们自己的任何细节
默认日志级别
此级别不应有任何消息,这样API的消费者就可以初始化它,如上所述。可以对进程执行 log config --mode "level:off"
,但不能对子系统执行。
信息日志级别
信息日志级别的日志语句具有以下具体用途。
- 执行主要操作,如初始化存档对象或从存档中删除文件
- 记录每个公共方法已被调用,以及其调用的参数
- 指示公共方法执行的主要操作
- 通知发生了异常条件(例如,导致块提前停止的行动或无返回值)
- 指出将发生循环,循环中将包含针对每个迭代的调试级别消息
调试日志级别
大多数消息都属于这一类别,非常详尽。所有非错误消息,且不属于其他两个类别的消息,均应为调试级别,以下是一些具体案例的例子。
- 任何私有方法中的日志消息
- 记录方法中的变量和参数值
- 指示一切正常进行
- 指示循环中的每次迭代发生的情况(或记录迭代发生的事实)
错误日志级别
- 每个生成的
NSError
都应记录与NSError
对象相同的详情消息 - 如果设计的时就知道错误代码的枚举值(例如
"URKErrorCodeArchiveNotFound"
),则NSError
日志消息应包含该字符串 - 应在发现错误的地方都报告错误,这样可以更容易地追踪它们在调用堆栈中的流程
- 导致预期工作未执行的提前退出
故障日志级别
在 Cocoa 框架方法返回错误时使用。只有少数几种用途
活动
- 公开方法具有带空格的英文活动名称,并且是大写形式
- 私有方法每个都有一个以方法名称命名的活动
- 在进入操作块但在此执行任何重大工作之前,对于重大范围更改,例如创建子活动
- 一个方法中的顶级活动将变量命名为
activity
,并将更具体的标签赋予子活动 - 如果一个方法严格是重载且仅调用其他重载而没有执行其他操作,那么它不应定义自己的活动
推送新的CocoaPods版本
新标记构建(在任一分支中)如果满足以下条件,将自动推送到CocoaPods
- 所有构建和测试都成功
- 库在CocoaPods和Carthage中构建成功
- 构建带有类似于版本号的东西(如
#.#.#(-beta#)
,例如 2.9 或 2.9-beta5) pod spec lint
通过,确保CocoaPod是100%有效的
在推送构建之前,您必须
-
将版本说明添加到 CHANGELOG.md,并提交
-
运行 set-version,如下所示
./Scripts/set-version.sh <版本号>
这执行以下操作
-
将 UnrarKit-Info.plist 文件更新为指示新版本号,并提交
-
创建一个带有以下消息的带注解的标签:版本说明在第1步中输入的
-
完成这之后,您可以调用 git push --follow-tags
1,让 Travis CI 处理剩余部分。
致谢
- Dov Frankel ([email protected])
- Rogerio Pereira Araujo ([email protected])
- Vicent Scott ([email protected])
1: 或设置git配置中的 followTags = true
以始终获取此行为
git config --global push.followTags true