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和终端看不到的原因。
修复步骤
先解析路径变量为真实系统路径
你已经使用path::parse获取了真实路径,但后续的fs调用仍在使用未解析的变量字符串。需要将fs操作的目标路径替换为解析后的真实路径。修改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(()) }) // ... 其他配置不变确认权限配置
你的tauri.conf.json中fs scope已经包含"$DOCUMENT"和"$DOCUMENT/*",这部分配置正确,无需修改,确保解析后的真实路径落在该权限范围内即可。
关键说明
Tauri的路径变量(如$DOCUMENT、$HOME)必须通过path::parse方法解析为系统真实路径后再使用。直接在fs API中传入变量字符串会触发Tauri的路径虚拟化,将操作指向应用沙箱内的隔离目录,而非系统公共目录。
内容的提问来源于stack exchange,提问作者ColonD
相关产品推荐
相关产品推荐

