Tauri应用writeTextFile路径不在配置范围内的问题求助
Tauri写入文件报错“Path not allowed on the configured scope”但读取正常
问题描述
用Svelte开发Tauri应用时,调用writeTextFile()向src-tauri/databases/db.json写入JSON数据,报错提示“Path not allowed on the configured scope”,但调用readTextFile()读取该文件却能正常获取数据。
相关配置与代码
Tauri配置文件
"tauri": { "allowlist": { "all": true, "path": { "all": true }, "fs": { "all": true, "readFile": true, "writeFile": true, "readDir": true, "copyFile": true, "createDir": true, "removeDir": true, "removeFile": true, "renameFile": true, "exists": true, "scope": [ "$RESOURCE/*", "$RESOURCE/databases/*", "$RESOURCE/databases/db.json" ] } }, "bundle": { "active": true, "identifier": "com.tauri.dev", "targets": "all", "resources": [ "databases/*", "databases/db.json" ] } }
业务代码片段
import { resourceDir } from '@tauri-apps/api/path'; import { readTextFile, writeTextFile } from '@tauri-apps/api/fs' await writeTextFile({ path: 'databases/db.json' , contents: data })
项目版本信息
{ "name": "svelt-pos", "private": true, "version": "0.0.0", "type": "module", "scripts": { "dev": "vite", "build": "vite build", "preview": "vite preview", "tauri": "tauri" }, "dependencies": { "@tauri-apps/api": "^1.2.0" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^2.0.0", "svelte": "^3.54.0", "vite": "^4.2.1", "@tauri-apps/cli": "^1.2.3" } }
解决方案
核心原因
Tauri的$RESOURCE资源目录是只读的,打包后该目录的文件会被嵌入到应用二进制包中,仅允许读取操作,无法直接写入修改。读取正常是因为配置的scope允许读取资源目录,但写入操作被安全策略拦截,导致路径权限报错。
解决步骤
切换到可写入目录
使用Tauri提供的$APPDATA目录(用户专属的应用数据目录),该目录默认支持读写操作。调整代码逻辑
先将资源目录中的初始数据库文件复制到$APPDATA目录,后续读写都针对该路径:import { appDataDir, resourceDir } from '@tauri-apps/api/path'; import { readTextFile, writeTextFile, exists, createDir, copyFile } from '@tauri-apps/api/fs'; // 获取应用数据目录路径 const appDataPath = await appDataDir(); const targetDbPath = `${appDataPath}/databases/db.json`; const targetDbDir = `${appDataPath}/databases`; // 确保目标目录存在 if (!(await exists(targetDbDir))) { await createDir(targetDbDir, { recursive: true }); } // 首次运行时,从资源目录复制初始数据库文件 if (!(await exists(targetDbPath))) { const resDir = await resourceDir(); const sourceDbPath = `${resDir}/databases/db.json`; await copyFile(sourceDbPath, targetDbPath); } // 执行写入操作 await writeTextFile(targetDbPath, data);更新Tauri配置
在fs.scope中添加$APPDATA/*,确保路径权限被允许:"fs": { "all": true, // 保留原有配置项 "scope": [ "$RESOURCE/*", "$APPDATA/*" // 添加该路径 ] }
内容的提问来源于stack exchange,提问作者mahmoud-bakheet
相关产品推荐
相关产品推荐

