rust 如何读取压缩的tar压缩档到'Vec< u8>'而不解压缩它?

j5fpnvbx  于 2023-02-12  发布在  其他
关注(0)|答案(1)|浏览(133)

我正试着上传一个字节向量到云存储。
这个字节向量应该是一个压缩的存档。为了实现这一点,我需要通过读取我创建的压缩存档来获得一个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();

有没有办法获得这个压缩存档的原始字节,这样我就可以上传到云存储?

dz6r00yl

dz6r00yl1#

archive.finish().unwrap();

这还不够:
仅当归档文件已完全写入且如果发生I/O错误,仍需获取底层对象时,才应调用此函数。
finish所做的全部工作就是写出两个空记录(表示归档结束),然后在Builder上设置finished标志。
您需要调用into_innerfinish()的gzip存档,然后您需要刷新/关闭文件本身。
实际上,调用tar::Builder::finish是不必要的,因为如果归档文件尚未完成,tar::Builder::into_inner会为您执行此操作。

相关问题