#archive #bindings #rar #file #abstraction #extract #unrar

sys no-std unrar_sys

对 unrar 的 FFI 绑定(具有最小抽象)

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压缩

Download history 397/week @ 2024-04-15 502/week @ 2024-04-22 424/week @ 2024-04-29 256/week @ 2024-05-06 473/week @ 2024-05-13 280/week @ 2024-05-20 516/week @ 2024-05-27 509/week @ 2024-06-03 357/week @ 2024-06-10 332/week @ 2024-06-17 484/week @ 2024-06-24 392/week @ 2024-07-01 502/week @ 2024-07-08 712/week @ 2024-07-15 838/week @ 2024-07-22 347/week @ 2024-07-29

2,409 每月下载量
用于 8 个 crate (2 直接)

MIT 许可证

745KB
21K SLoC

C++ 20K SLoC // 0.1% comments Visual Studio Project 699 SLoC Rust 390 SLoC // 0.0% comments Shell 19 SLoC

unrar

crates.io API docs build MIT license

由 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 结构提供两大类方法

  1. 不接触文件系统的方法。这些是基于野外 RAR 路径约定的有意见的实用方法。通常,多部分文件通常具有如 .part08.rar.r08.rar 这样的扩展名。由于提取必须从第一部分开始,使用例如 archive.as_first_part() 等方法找出可能很有帮助。
  2. 以指定模式打开底层路径的方法(可能的模式有 ListListSplitProcess)。这些方法中包含单词 open,是可能出错的操作,在 Result 中返回 OpenArchive,如下所示

OpenArchive

存档以以下三种模式之一打开:ListListSplitProcess。这个库不提供对存档的随机访问。相反,存档内的文件只能按流的方式、单向、从前到后处理,交替进行 ReadHeaderProcessFile 操作(如底层 C++ 库所规定的)。

这就是游标背后的思想

OpenArchive: 游标

通过游标,存档跟踪下一次允许的操作

该库通过利用 typestate 模式 来强制执行此规则。一旦打开存档,就处于 CursorBeforeHeader 状态,因此必须调用它的 read_header 方法,该方法返回一个新的 OpenArchive 实例,该实例处于 CursorBeforeFile 状态,仅公开映射到内部 ProcessFile 操作的方法。每个步骤中可用的方法取决于存档的当前状态和打开时使用的模式。

Open模式/游标位置的可用方法

以下是 OpenMode/Cursor 组合公开的方法概述

Open模式↓ ╲ 游标位置→ 在头部之前 在文件之前
ListListSplit 读取头部 跳过
处理 读取头部 skipreadextractextract_toextract_with_base

OpenArchive: 迭代器

ListListSplit模式下打开的归档也实现了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句柄处理归档
  • 从字节流处理归档

贡献

请随意贡献!如果您发现了一个错误,请打开一个问题。

欢迎提交拉取请求!

帮助

如果您需要使用库的帮助,请创建一个新的讨论或打开一个问题。

许可证

本库贡献者所编写的部分受以下许可证之一许可:

任选其一。

嵌入的C/C++库使用其自己的许可证。有关更多信息,请参阅其许可证文件

依赖关系