pna

A pna archive reading/writing library for Rust.
[dependencies]
pna = "0.5"
Reading an archive
use pna::{Archive, ReadOption};
use std::fs::File;
use std::io::{self, copy, prelude::*};
fn main() -> io::Result<()> {
let file = File::open("foo.pna")?;
let mut archive = Archive::read_header(file)?;
for entry in archive.entries_skip_solid() {
let entry = entry?;
let mut file = File::create(entry.header().path().as_path())?;
let mut reader = entry.reader(ReadOption::builder().build())?;
copy(&mut reader, &mut file)?;
}
Ok(())
}
Writing an archive
use pna::{Archive, EntryBuilder, WriteOption};
use std::fs::File;
use std::io::{self, prelude::*};
fn main() -> io::Result<()> {
let file = File::create("foo.pna")?;
let mut archive = Archive::write_header(file)?;
let mut entry_builder = EntryBuilder::new_file(
"bar.txt".try_into().unwrap(),
WriteOption::builder().build(),
)?;
entry_builder.write(b"content")?;
let entry = entry_builder.build()?;
archive.add_entry(entry)?;
archive.finalize()?;
Ok(())
}
CLI
Command line user interface are available and you can install via cargo or build from source.
Via Cargo
cargo install portable-network-archive
From Source (via Cargo)
git clone https://github.com/ChanTsune/Portable-Network-Archive.git
cargo install --path cli
License
This project is licensed under either of
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in this project by you, as defined in the Apache-2.0 license,
shall be dual licensed as above, without any additional terms or conditions.