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

Rust Tauri中fs::create_dir_all返回Ok但目录未实际创建的问题

Tauri创建目录后Finder/终端不可见但read_dir可检测的问题修复

问题根源

你调用fs::create_dir_all("$DOCUMENT/QueryIOProjects")时,直接传入了未解析的路径变量字符串,Tauri的fs API不会自动解析$DOCUMENT这类变量,导致目录被创建到应用沙箱内的虚拟路径,而非系统真实的Documents目录。这就是为什么read_dir("$DOCUMENT/")能读到该目录(因为它同样访问的是沙箱内的虚拟目录),但Finder和终端看不到的原因。

修复步骤

  1. 先解析路径变量为真实系统路径
    你已经使用path::parse获取了真实路径,但后续的fs调用仍在使用未解析的变量字符串。需要将fs操作的目标路径替换为解析后的真实路径。

  2. 修改src-tauri/src/main.rs代码
    调整setup函数中的路径处理逻辑,确保所有fs操作使用解析后的真实路径:

    tauri::Builder::default()
        // ... 其他配置不变
        .setup(|app| {
            // 先解析$DOCUMENT的真实路径
            let document_path = path::parse(
                &app.config(),
                app.package_info(),
                &app.env(),
                "$DOCUMENT"
            ).expect("Failed to resolve $DOCUMENT path");
            
            // 拼接目标目录路径
            let projects_path = document_path.join("QueryIOProjects");
            let path_str = projects_path.to_string_lossy().to_string();
    
            // 创建目录:使用解析后的真实路径
            match fs::create_dir_all(&projects_path) {
                Ok(_) => println!("Projects Directory created at {}", path_str),
                Err(e) => println!("Failed to create project directory: {}", e),
            }
    
            // 读取目录:同样使用真实路径
            match fs::read_dir(&document_path) {
                Ok(read_dir) => {
                    read_dir.for_each(|entry_res| match entry_res {
                        Ok(entry) => println!(
                            "dirEntry = {}",
                            entry.file_name().into_string().expect("Invalid directory entry name")
                        ),
                        Err(e) => println!("Directory read error: {}", e),
                    });
                }
                Err(e) => println!("Failed to read directory: {}", e),
            }
            Ok(())
        })
        // ... 其他配置不变
    
  3. 确认权限配置
    你的tauri.conf.json中fs scope已经包含"$DOCUMENT"和"$DOCUMENT/*",这部分配置正确,无需修改,确保解析后的真实路径落在该权限范围内即可。

关键说明

Tauri的路径变量(如$DOCUMENT、$HOME)必须通过path::parse方法解析为系统真实路径后再使用。直接在fs API中传入变量字符串会触发Tauri的路径虚拟化,将操作指向应用沙箱内的隔离目录,而非系统公共目录。

内容的提问来源于stack exchange,提问作者ColonD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:17:41