使用sevenz_rust::decompress_file时遭遇‘文件或目录不存在’错误
sevenz_rust::decompress_file 报错“文件或目录不存在”的解决方法
你的错误核心原因是sevenz_rust的decompress_file函数不会自动创建目标目录。当你传入的目标路径不存在时,函数无法向其中写入解压内容,因此抛出NotFound错误。你的代码中target = path.with_extension("")生成了一个新的目录路径,但这个目录并未提前创建,这就是问题所在。
解决方案
在调用decompress_file之前,用std::fs::create_dir_all创建目标目录(该函数会自动生成所有不存在的父目录)。修改后的代码如下:
use std::fs; use std::path::{Path, PathBuf}; use sevenz_rust::decompress_file; fn get_full_path(filename: &str) -> Option<PathBuf> { let formatted_filename = format!("data/{}.7z", filename); let filepath = Path::new(&formatted_filename); fs::canonicalize(filepath).ok() } fn main() { let filename = "enwiki-20230201-pages-meta-history1.xml-p1p857"; if let Some(path) = get_full_path(filename) { let target = path.with_extension(""); println!("Result Path: {:?}", target); // 提前创建目标目录(含父目录) fs::create_dir_all(&target).expect("Failed to create target directory"); decompress_file(path, target).expect("complete"); } else { println!("Failed to get full path."); } }
额外优化建议
你可以简化get_full_path函数,decompress_file支持直接接受相对路径,不需要提前调用fs::canonicalize:
fn get_full_path(filename: &str) -> PathBuf { Path::new("data").join(format!("{filename}.7z")) }
这样即使源文件不存在,后续decompress_file会抛出对应的错误,逻辑更直观。
内容的提问来源于stack exchange,提问作者Megan
相关产品推荐
相关产品推荐

