zip

Constant ZIP64_BYTES_THR

Source
pub const ZIP64_BYTES_THR: u64 = _; // 4_294_967_295u64
Expand description

The file size at which a ZIP64 record becomes necessary.

If a file larger than this threshold attempts to be written, compressed or uncompressed, and FileOptions::large_file() was not true, then [ZipWriter] will raise an io::Error with io::ErrorKind::Other.

If the zip file itself is larger than this value, then a zip64 central directory record will be written to the end of the file.

 use std::io::{self, Cursor, prelude::*};
 use std::error::Error;
 use zip::{ZipWriter, write::SimpleFileOptions};

 let mut zip = ZipWriter::new(Cursor::new(Vec::new()));
 // Writing an extremely large file for this test is faster without compression.
 let options = SimpleFileOptions::default().compression_method(zip::CompressionMethod::Stored);

 let big_len: usize = (zip::ZIP64_BYTES_THR as usize) + 1;
 let big_buf = vec![0u8; big_len];
 zip.start_file("zero.dat", options)?;
 // This is too big!
 let res = zip.write_all(&big_buf[..]).err().unwrap();
 assert_eq!(res.kind(), io::ErrorKind::Other);
 let description = format!("{}", &res);
 assert_eq!(description, "Large file option has not been set");
 // Attempting to write anything further to the same zip will still succeed, but the previous
 // failing entry has been removed.
 zip.start_file("one.dat", options)?;
 let zip = zip.finish_into_readable()?;
 let names: Vec<_> = zip.file_names().collect();
 assert_eq!(&names, &["one.dat"]);

 // Create a new zip output.
 let mut zip = ZipWriter::new(Cursor::new(Vec::new()));
 // This time, create a zip64 record for the file.
 let options = options.large_file(true);
 zip.start_file("zero.dat", options)?;
 // This succeeds because we specified that it could be a large file.
 assert!(zip.write_all(&big_buf[..]).is_ok());