Tauri生产环境下无法复制内置文件至用户目录的问题
解决方案:Tauri生产环境内置资源复制问题
问题根源
开发环境中你用的相对路径.\\src\\assets\\template.xlsx基于项目根目录,能正常找到文件,但MSI安装后,程序的资源文件会被打包到程序安装目录的resources子文件夹中,前端传递的相对路径无法定位到这个位置,导致复制失败。
正确实现步骤
配置资源打包路径
修改src-tauri/tauri.conf.json,确保你的assets目录被纳入打包资源:{ "build": { "assets": ["src/assets"] } }这会让Tauri打包时把
src-tauri/src/assets下的文件复制到生产环境的资源目录中。修改Rust后端命令
不要依赖前端传递的源路径,而是用Tauri的API直接获取生产环境的资源目录,确保路径正确:#[tauri::command] fn copy_template(destination: &str) -> Result<(), String> { // 获取生产环境的资源目录 let resource_dir = tauri::api::path::resource_dir() .ok_or("无法访问资源目录")?; // 拼接模板文件的绝对路径(注意和你实际文件名一致,这里是diot_template.xlsx) let source_path = resource_dir.join("diot_template.xlsx"); // 执行复制并返回结果 std::fs::copy(source_path, destination) .map_err(|err| err.to_string()) }这里把命令改为直接处理模板复制,不再接收前端传的源路径,避免路径错误。
修改前端调用逻辑
去掉前端的源路径拼接,直接调用新的后端命令,并处理可能的错误:async function downloadTemplate() { const destination = await scripts.handleSelectFolder("Select folder") // 注意文件名要和Rust端一致 const fullDestination = `${destination}\\diot_template.xlsx`; try { await invoke('copy_template', { destination: fullDestination }); await openDirectory(destination); } catch (err) { console.error('模板复制失败:', err); alert('无法复制模板文件,请检查目录权限或重试'); } }
额外注意事项
- 确保你的模板文件名在代码和实际项目中一致(你代码里写的是
template.xlsx,但项目里是diot_template.xlsx,这里要统一) - 生产环境中程序可能需要管理员权限才能写入某些目录(比如C盘根目录),建议在用户选择目录时引导到非系统盘,或者处理权限错误。
内容的提问来源于stack exchange,提问作者H3lltronik
相关产品推荐
相关产品推荐

