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 解析器实现
69,249 每月下载量
用于 66 个crate (39 直接)
80KB
1.5K SLoC
rust-ar
用于编码/解码 Unix 归档 (.a) 文件的 Rust 库。
概述
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();
}