mf_file/zipdoc/
reader.rs

1use std::io::{self, Read, Seek};
2use zip::ZipArchive;
3
4// 基于 ZIP 的文档读取器
5pub struct ZipDocumentReader<R: Read + Seek> {
6    pub(crate) zip: ZipArchive<R>,
7}
8
9impl<R: Read + Seek> ZipDocumentReader<R> {
10    // 打开读取器
11    pub fn new(r: R) -> io::Result<Self> {
12        Ok(Self { zip: ZipArchive::new(r)? })
13    }
14    // 读取指定文件完整内容
15    pub fn read_all(
16        &mut self,
17        name: &str,
18    ) -> io::Result<Vec<u8>> {
19        let mut f = self.zip.by_name(name)?;
20        let mut buf = Vec::with_capacity(f.size() as usize);
21        std::io::copy(&mut f, &mut buf)?;
22        Ok(buf)
23    }
24}