我正试着上传一个字节向量到云存储。
这个字节向量应该是一个压缩的存档。为了实现这一点,我需要通过读取我创建的压缩存档来获得一个Vec<u8>
。我知道gzip文件不包含它们的大小,当我试图正常读取它时,我没有得到所有的字节。
看起来它只读取头,因为结果向量是10个字节。
示例
use std::io::Read;
fn main() {
// Creates the archive and compresses it.
let file = std::fs::File::create("example.tar.gz").unwrap();
let encoder = flate2::write::GzEncoder::new(file, flate2::Compression::default());
let mut archive = tar::Builder::new(encoder);
archive.append_dir_all("example_dir", "path/to/example_dir").unwrap();
archive.finish().unwrap();
// I see that this does not work since it reads a wrong length.
// But I don't know how to achive it.
let example_bytes : Vec<u8> = std::fs::read("example.tar.gz").unwrap();
dbg!(example_bytes.len());
// Corrupt
std::fs::write("rewritten.tar.gz", example_bytes).unwrap();
}
如果我尝试使用BufReader
,
let file = File::open("example.tar.gz").unwrap();
let mut file = std::io::BufReader::new(file);
let mut bytes = Vec::new();
file.rewind().unwrap();
file.read_to_end(&mut bytes).unwrap();
// Corrupt
// The resulting file is not 10 bytes this time but,
// 392 bytes less than the original amount.
// The corrupt file ends with the sequence
// FF D3 E5 FF 3B F6 5F A3 F8 if it means something.
std::fs::write("rewritten.tar.gz", bytes).unwrap();
有没有办法获得这个压缩存档的原始字节,这样我就可以上传到云存储?
1条答案
按热度按时间dz6r00yl1#
这还不够:
仅当归档文件已完全写入且如果发生I/O错误,仍需获取底层对象时,才应调用此函数。
finish
所做的全部工作就是写出两个空记录(表示归档结束),然后在Builder
上设置finished
标志。您需要调用
into_inner
到finish()
的gzip存档,然后您需要刷新/关闭文件本身。实际上,调用
tar::Builder::finish
是不必要的,因为如果归档文件尚未完成,tar::Builder::into_inner
会为您执行此操作。