我正在使用此 rust 代码在 macOS 13.3.1 中生成 zip 文件:
use std::{path::Path, fs::File};
use zip::{ZipWriter, write::FileOptions};
fn main() {
let file = File::create("/Users/xiaoqiangjiang/source/reddwarf/backend/texhub-server/archive.zip").unwrap();
let mut zip = ZipWriter::new(file);
let folder_path = Path::new("/Users/xiaoqiangjiang/source/reddwarf/backend/texhub-server");
visit_folder(folder_path, &mut zip, "").unwrap();
zip.finish().unwrap();
}
fn visit_folder(path: &Path, zip: &mut ZipWriter<File>, parent: &str) -> std::io::Result<()> {
for entry in path.read_dir()? {
let entry = entry?;
let file_path = entry.path();
let file_name = file_path.file_name().unwrap().to_string_lossy().into_owned();
let zip_path = format!("{}{}/{}", parent, path.file_name().unwrap().to_string_lossy(), file_name);
if file_path.is_dir() {
visit_folder(&file_path, zip, &zip_path)?;
} else {
let mut file = File::open(&file_path)?;
let options = FileOptions::default()
.compression_method(zip::CompressionMethod::Deflated)
.unix_permissions(0o755);
zip.start_file(zip_path, options)?;
std::io::copy(&mut file, zip)?;
}
}
Ok(())
}
这段代码工作正常,但是当我打开 rust 生成的 zip 文件时。显示错误Error 0 - undefined error 0
。我错过了什么吗?我应该怎么做才能解决这个问题?这是Cargo.toml
:
[package]
name = "rust-learn"
version = "0.1.0"
edition = "2018"
[dependencies]
serde = { version = "1.0.64", features = ["derive"] }
serde_json = "1.0.64"
rust_wheel = { git = "https://github.com/jiangxiaoqiang/rust_wheel.git", branch = "diesel2.0", features = [
"model",
"common",
"rwconfig",
"texhub"
] }
zip = "0.6"
在我的机器上,这段代码不能正常工作:我得到:
这是因为正如 prog-fh 所指出的,存档是在压缩的目录内创建的。这意味着它将被添加到自身中。
因为
archive.zip
它是全新的,所以很可能最后被 迭代read_dir
,并且因为当它到达自身时目录已经相当大,archive.zip
几乎肯定会包含足够的数据,zip-rs 在将其写入自身时需要刷新,这意味着您将获得无限的数据。 -size 文件,因为它不断写入新数据,然后将其压缩回自身。这会导致archive.zip
超过 4GB,并且由于 zip-rs 默认情况下不启用 zip64,因此会出现故障。无论如何,该archive.zip
文件都存在,它只是垃圾。可能在您的情况下,IO 或目录迭代顺序使得它在某一点停止写入,但存档可能会被不正确地终止。或者也许您只是以某种方式使输出静音。
解决方案是在该目录之外创建 zip 文件,或者修改代码以使其不会被拾取。
顺便说一句,目前尚不完全清楚什么
意味着(用什么打开?)但您可以使用
unzip -t
estt
档案。这可能会提供更丰富、更容易调查的错误。