5 个不稳定版本
0.3.1 | 2023年11月11日 |
---|---|
0.3.0 | 2023年6月22日 |
0.2.1 | 2019年12月21日 |
0.2.0 | 2015年8月3日 |
0.1.0 | 2015年8月2日 |
#340 在 压缩
2,409 每月下载量
用于 8 个 crate (2 直接)
745KB
21K SLoC
unrar
由 rarlab 提供的 unrar C 库的高级包装。
此库只能 提取 和 列出 存档,不能 创建 存档。
请查看 示例目录 以了解如何使用此库。特别是 lister 示例有很好的文档和高级功能!
列出存档条目的基本示例
use unrar::Archive;
fn main() {
for entry in Archive::new("archive.rar").open_for_listing().unwrap() {
println!("{}", entry.unwrap());
}
}
运行此示例: cargo run --example basic_list path/to/archive.rar
. 您可以使用 rar
CLI 创建存档: rar a archive.rar .
概览
此 crate 中的主要类型是 Archive
,表示文件系统上的存档。 Archive
本身不进行文件系统操作,除非调用其中一个 open
方法,返回一个 OpenArchive
。
存档
Archive
结构提供两大类方法
- 不接触文件系统的方法。这些是基于野外 RAR 路径约定的有意见的实用方法。通常,多部分文件通常具有如
.part08.rar
或.r08.rar
这样的扩展名。由于提取必须从第一部分开始,使用例如archive.as_first_part()
等方法找出可能很有帮助。 - 以指定模式打开底层路径的方法(可能的模式有
List
、ListSplit
和Process
)。这些方法中包含单词open
,是可能出错的操作,在Result
中返回OpenArchive
,如下所示open_for_listing
和open_for_listing_split
:列出存档条目(跳过内容/有效载荷)open_for_processing
:处理存档条目以及内容/有效载荷break_open
:即使返回错误也要读取存档,如果可能的话。必须显式提供OpenMode
。
OpenArchive
存档以以下三种模式之一打开:List
、ListSplit
或 Process
。这个库不提供对存档的随机访问。相反,存档内的文件只能按流的方式、单向、从前到后处理,交替进行 ReadHeader
和 ProcessFile
操作(如底层 C++ 库所规定的)。
这就是游标背后的思想
OpenArchive: 游标
通过游标,存档跟踪下一次允许的操作
该库通过利用 typestate 模式 来强制执行此规则。一旦打开存档,就处于 CursorBeforeHeader
状态,因此必须调用它的 read_header
方法,该方法返回一个新的 OpenArchive
实例,该实例处于 CursorBeforeFile
状态,仅公开映射到内部 ProcessFile
操作的方法。每个步骤中可用的方法取决于存档的当前状态和打开时使用的模式。
Open模式/游标位置的可用方法
以下是 OpenMode/Cursor 组合公开的方法概述
Open模式↓ ╲ 游标位置→ | 在头部之前 | 在文件之前 |
---|---|---|
List 、ListSplit |
读取头部 |
跳过 |
处理 |
读取头部 |
skip ,read ,extract ,extract_to ,extract_with_base |
OpenArchive: 迭代器
在List
或ListSplit
模式下打开的归档也实现了Iterator
,而Process
模式下的归档则没有(尽管未来版本可能会有所改变)。这是因为前两者在读取并返回头部信息的同时被迫跳过数据包,而后者具有更复杂的处理可能性,不容易用Iterator
来传达。
示例
对于更复杂的示例,请参阅examples/
文件夹。
以下是一个返回文件第一个内容的函数示例
fn first_file_content<P: AsRef<Path>>(path: P) -> UnrarResult<Vec<u8>> {
let archive = Archive::new(&path).open_for_processing()?; // cursor: before header
let archive = archive.read_header()?.expect("empty archive"); // cursor: before file
dbg!(&archive.entry().filename);
let (data, _rest) = archive.read()?; // cursor: before header
Ok(data)
}
# use std::path::Path;
# use unrar::{Archive, UnrarResult};
#
# let data = first_file_content("data/version.rar").unwrap();
# assert_eq!(std::str::from_utf8(&data), Ok("unrar-0.4.0"));
特性
- 多部分文件
- 列出归档
- 提取它们
- 将它们读入内存(不提取)
- 测试它们
- 带密码的加密归档
- 静态链接到unrar源。
- 从源代码构建unrar C++代码
- 基于文件名/路径的基本功能(不读取归档)
- 文档/RustDoc
- 测试套件
- 利用类型系统强制正确使用
- 精心设计的错误(计划中)
- TBD
非特性
由于这个库只是一个包装器,以下特性不易实现,因此没有计划
- 创建归档
- 对任意归档条目进行随机访问
- 纯Rust实现
- 从文件描述符/ fs::File句柄处理归档
- 从字节流处理归档
贡献
请随意贡献!如果您发现了一个错误,请打开一个问题。
欢迎提交拉取请求!
帮助
如果您需要使用库的帮助,请创建一个新的讨论或打开一个问题。
许可证
本库贡献者所编写的部分受以下许可证之一许可:
- Apache License,版本2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。