diff options
Diffstat (limited to 'third_party/rust/zip/examples/write_dir.rs')
-rw-r--r-- | third_party/rust/zip/examples/write_dir.rs | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/third_party/rust/zip/examples/write_dir.rs b/third_party/rust/zip/examples/write_dir.rs new file mode 100644 index 0000000000..0e6f59bd24 --- /dev/null +++ b/third_party/rust/zip/examples/write_dir.rs @@ -0,0 +1,96 @@ +extern crate zip; +extern crate walkdir; + +use std::io::prelude::*; +use std::io::{Write, Seek}; +use std::iter::Iterator; +use zip::write::FileOptions; +use zip::result::ZipError; + +use walkdir::{WalkDir, DirEntry}; +use std::path::Path; +use std::fs::File; + +fn main() { + std::process::exit(real_main()); +} + +const METHOD_STORED : Option<zip::CompressionMethod> = Some(zip::CompressionMethod::Stored); + +#[cfg(feature = "flate2")] +const METHOD_DEFLATED : Option<zip::CompressionMethod> = Some(zip::CompressionMethod::Deflated); +#[cfg(not(feature = "flate2"))] +const METHOD_DEFLATED : Option<zip::CompressionMethod> = None; + +#[cfg(feature = "bzip2")] +const METHOD_BZIP2 : Option<zip::CompressionMethod> = Some(zip::CompressionMethod::Bzip2); +#[cfg(not(feature = "bzip2"))] +const METHOD_BZIP2 : Option<zip::CompressionMethod> = None; + +fn real_main() -> i32 { + let args: Vec<_> = std::env::args().collect(); + if args.len() < 3 { + println!("Usage: {} <source_directory> <destination_zipfile>", + args[0]); + return 1; + } + + let src_dir = &*args[1]; + let dst_file = &*args[2]; + for &method in [METHOD_STORED, METHOD_DEFLATED, METHOD_BZIP2].iter() { + if method.is_none() { continue } + match doit(src_dir, dst_file, method.unwrap()) { + Ok(_) => println!("done: {} written to {}", src_dir, dst_file), + Err(e) => println!("Error: {:?}", e), + } + } + + return 0; +} + +fn zip_dir<T>(it: &mut Iterator<Item=DirEntry>, prefix: &str, writer: T, method: zip::CompressionMethod) + -> zip::result::ZipResult<()> + where T: Write+Seek +{ + let mut zip = zip::ZipWriter::new(writer); + let options = FileOptions::default() + .compression_method(method) + .unix_permissions(0o755); + + let mut buffer = Vec::new(); + for entry in it { + let path = entry.path(); + let name = path.strip_prefix(Path::new(prefix)) + .unwrap() + .to_str() + .unwrap(); + + if path.is_file() { + println!("adding {:?} as {:?} ...", path, name); + zip.start_file(name, options)?; + let mut f = File::open(path)?; + + f.read_to_end(&mut buffer)?; + zip.write_all(&*buffer)?; + buffer.clear(); + } + } + zip.finish()?; + Result::Ok(()) +} + +fn doit(src_dir: &str, dst_file: &str, method: zip::CompressionMethod) -> zip::result::ZipResult<()> { + if !Path::new(src_dir).is_dir() { + return Err(ZipError::FileNotFound); + } + + let path = Path::new(dst_file); + let file = File::create(&path).unwrap(); + + let walkdir = WalkDir::new(src_dir.to_string()); + let it = walkdir.into_iter(); + + zip_dir(&mut it.filter_map(|e| e.ok()), src_dir, file, method)?; + + Ok(()) +}
\ No newline at end of file |