You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:05:27