12 个版本 (破坏性更新)

使用旧的 Rust 2015

0.9.0 2021 年 8 月 16 日
0.8.0 2019 年 8 月 31 日
0.7.0 2019 年 5 月 2 日
0.6.2 2018 年 12 月 2 日
0.2.0 2017 年 3 月 4 日

#352 in 解析器实现

Download history 16633/week @ 2024-03-14 17146/week @ 2024-03-21 14731/week @ 2024-03-28 14762/week @ 2024-04-04 14084/week @ 2024-04-11 16130/week @ 2024-04-18 16014/week @ 2024-04-25 16419/week @ 2024-05-02 15543/week @ 2024-05-09 16017/week @ 2024-05-16 17064/week @ 2024-05-23 18553/week @ 2024-05-30 16765/week @ 2024-06-06 16838/week @ 2024-06-13 16196/week @ 2024-06-20 16729/week @ 2024-06-27

69,249 每月下载量
用于 66 个crate (39 直接)

MIT 许可证

80KB
1.5K SLoC

rust-ar

Build Status Build status

用于编码/解码 Unix 归档 (.a) 文件的 Rust 库。

文档: https://docs.rs/ar

概述

ar crate 是一个纯 Rust 实现的 Unix 归档文件 读取器和写入器。这个库提供了一个流式接口,类似于 tar crate,避免了将整个归档条目加载到内存中的需求。

许可证

rust-ar 在 MIT 许可证 下提供。


lib.rs:

用于编码/解码 Unix 归档文件的库。

这个库提供了管理 Unix 归档文件 (由标准的 ar 命令行工具生成) 所必需的实用程序,它通过读取器或写入器进行抽象。这个库提供了一个流式接口,避免了将整个归档条目加载到内存中的需求。

这个crate的API旨在与 tar crate 相似。

格式变体

Unix 归档文件有几种变体,其中三种是最常见的

  • 常见变体,用于 Debian 软件包 (.deb) 文件等,它只支持长度不超过16个字符的文件名。
  • BSD 变体,用于 BSD 系统(包括 Mac OS X)上的 ar 工具,与常见变体向后兼容,但扩展到支持更长的文件名和包含空格的文件名。
  • GNU 变体,用于 GNU 和许多其他系统(包括 Windows)上的 ar 工具,与常见格式相似,但以略微不同的方式存储文件名,并有自己的策略来支持长文件名。

这个crate支持读取和写入这三种变体。

示例用法

编写归档

use ar::Builder;
use std::fs::File;
// Create a new archive that will be written to foo.a:
let mut builder = Builder::new(File::create("foo.a").unwrap());
// Add foo/bar.txt to the archive, under the name "bar.txt":
builder.append_path("foo/bar.txt").unwrap();
// Add foo/baz.txt to the archive, under the name "hello.txt":
let mut file = File::open("foo/baz.txt").unwrap();
builder.append_file(b"hello.txt", &mut file).unwrap();

读取归档

use ar::Archive;
use std::fs::File;
use std::io;
use std::str;
// Read an archive from the file foo.a:
let mut archive = Archive::new(File::open("foo.a").unwrap());
// Iterate over all entries in the archive:
while let Some(entry_result) = archive.next_entry() {
    let mut entry = entry_result.unwrap();
    // Create a new file with the same name as the archive entry:
    let mut file = File::create(
        str::from_utf8(entry.header().identifier()).unwrap(),
    ).unwrap();
    // The Entry object also acts as an io::Read, so we can easily copy the
    // contents of the archive entry into the file:
    io::copy(&mut entry, &mut file).unwrap();
}

无运行时依赖