UnrarKit 2.10

UnrarKit 2.10

测试测试通过
Lang语言 C++C++
许可证 BSD-2-Clause
发布最新发布2022年2月

Dov Frankel 维护。



  • Dov Frankel

Build Status Cocoapods Carthage compatible Cocoapods platforms

关于

UnrarKit 的目的是为 Mac 和 iOS 应用程序提供易于使用的 RAR 文件只读操作。目前基于 UnRAR 库 的 5.8.1 版本。

项目包括主项目、单元测试以及一个基本的 iOS 示例项目,演示如何使用该库。要查看所有这些,请打开主工作空间文件。

我始终欢迎改进,请提交您的 pull 请求,或 创建问题 由他人来实现。

安装

UnrarKit 支持现有 CocoaPodsCarthage。由于 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
                }];

进度报告

以下方法支持 NSProgressNSProgressReporting

  • 将文件提取到:覆盖:错误
  • 提取数据:错误
  • 从文件中提取数据:错误
  • 对存档中的文件执行:错误
  • 对存档中的数据执行:错误
  • 从文件中提取缓冲数据:错误:操作

使用隐式 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] 来停止正在进行的操作。它会导致操作失败,返回 nilNO(根据返回类型,并提供一个带有错误代码 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

可用的级别,按照日志详细程度的递增顺序是 defaultinfodebug,其中debug是默认值。

日志记录指南

这些都是关于如何分类和编写活动及日志消息的一般规则。它们是在第一轮日志消息被编写之后编写的,因此可能存在一些不一致(如错误的日志级别)。如果您认为您发现了其中一个,请打开一个问题或拉取请求!

日志记录

日志消息应遵循以下约定。

  1. 日志消息没有最终标点符号(如这些列表项)
  2. 指出即将调用C函数,而不是更高层的UnrarKit或Cocoa方法的消息以"..."结尾,因为这些方法不会记录它们自己的任何细节

默认日志级别

此级别不应有任何消息,这样API的消费者就可以初始化它,如上所述。可以对进程执行 log config --mode "level:off",但不能对子系统执行。

信息日志级别

信息日志级别的日志语句具有以下具体用途。

  1. 执行主要操作,如初始化存档对象或从存档中删除文件
  2. 记录每个公共方法已被调用,以及其调用的参数
  3. 指示公共方法执行的主要操作
  4. 通知发生了异常条件(例如,导致块提前停止的行动或无返回值)
  5. 指出将发生循环,循环中将包含针对每个迭代的调试级别消息

调试日志级别

大多数消息都属于这一类别,非常详尽。所有非错误消息,且不属于其他两个类别的消息,均应为调试级别,以下是一些具体案例的例子。

  1. 任何私有方法中的日志消息
  2. 记录方法中的变量和参数值
  3. 指示一切正常进行
  4. 指示循环中的每次迭代发生的情况(或记录迭代发生的事实)

错误日志级别

  1. 每个生成的 NSError 都应记录与 NSError 对象相同的详情消息
  2. 如果设计的时就知道错误代码的枚举值(例如 "URKErrorCodeArchiveNotFound"),则 NSError 日志消息应包含该字符串
  3. 应在发现错误的地方都报告错误,这样可以更容易地追踪它们在调用堆栈中的流程
  4. 导致预期工作未执行的提前退出

故障日志级别

在 Cocoa 框架方法返回错误时使用。只有少数几种用途

活动

  1. 公开方法具有带空格的英文活动名称,并且是大写形式
  2. 私有方法每个都有一个以方法名称命名的活动
  3. 在进入操作块但在此执行任何重大工作之前,对于重大范围更改,例如创建子活动
  4. 一个方法中的顶级活动将变量命名为 activity,并将更具体的标签赋予子活动
  5. 如果一个方法严格是重载且仅调用其他重载而没有执行其他操作,那么它不应定义自己的活动

推送新的CocoaPods版本

新标记构建(在任一分支中)如果满足以下条件,将自动推送到CocoaPods

  1. 所有构建和测试都成功
  2. 库在CocoaPods和Carthage中构建成功
  3. 构建带有类似于版本号的东西(如#.#.#(-beta#),例如 2.92.9-beta5
  4. pod spec lint 通过,确保CocoaPod是100%有效的

在推送构建之前,您必须

  1. 将版本说明添加到 CHANGELOG.md,并提交

  2. 运行 set-version,如下所示

    ./Scripts/set-version.sh <版本号>

    这执行以下操作

    1. UnrarKit-Info.plist 文件更新为指示新版本号,并提交

    2. 创建一个带有以下消息的带注解的标签:版本说明在第1步中输入的

完成这之后,您可以调用 git push --follow-tags1,让 Travis CI 处理剩余部分。

致谢


1: 或设置git配置中的 followTags = true 以始终获取此行为

git config --global push.followTags true