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());