在現代桌面應用程式開發中,檔案系統操作是不可或缺的功能。無論是儲存使用者設定、處理文件資料,還是建立應用程式的工作目錄,我們都需要與本機檔案系統進行互動。然而,Tauri 以安全為核心的設計理念,在提供強大檔案操作能力的同時,也建立了嚴格的安全機制來保護使用者的系統安全。
(突然發現昨天忘了放 roadmap...)
tauri-plugin-fs
Tauri 的 plugin 的安裝都很簡單,只要下這個指令就可以自動安裝了:
npm run tauri add fs
安裝完之後,理論上就可以直接使用了。預設是給予 store:default
權限:
{
"permissions": [
...,
+ "fs:default",
]
}
但通常是不太夠用,所以之後還需要依照需求去調整 capabilities,給予合適的權限。
import { readTextFile, BaseDirectory } from "@tauri-apps/plugin-fs";
try {
const content = await readTextFile("temp\\test.txt", {
baseDir: BaseDirectory.Desktop,
});
} catch (error) {
// 會捕獲到權限被拒絕的錯誤
console.error('Permission denied:', error);
}
BaseDirectory
是一個非常重要的概念,它提供了多個預設的目錄路徑,例如:
BaseDirectory.AppConfig
:應用程式設定檔目錄BaseDirectory.AppData
:應用程式資料目錄BaseDirectory.Document
:使用者的文件目錄BaseDirectory.Download
:使用者的下載目錄BaseDirectory.Desktop
:使用者的桌面目錄使用 BaseDirectory
不僅方便,更重要的是安全性。Tauri 透過這種方式,將檔案操作限制在應用程式可控的範圍內,避免惡意或無意的程式碼去存取系統敏感檔案。
除了讀取文字檔案外,tauri-plugin-fs
還提供了完整的檔案系統操作功能。你可以使用 writeTextFile
來寫入文字內容到檔案,或是透過 writeFile
和 readFile
來處理二進位檔案,這對於處理圖片、音訊或其他媒體檔案特別有用。
對於目錄操作,插件提供了 readDir
來列出目錄內容、mkdir
來建立新目錄,以及 remove
來刪除目錄。檔案管理方面,你可以使用 copyFile
複製檔案、rename
重新命名或移動檔案,以及 remove
刪除不需要的檔案。
此外,還有實用的檔案資訊查詢功能,像是 exists
來檢查檔案或目錄是否存在、stat
來獲取檔案或資料夾的 Metadata。
這些功能涵蓋了大部分應用程式所需的檔案系統操作,讓你能夠完整地管理應用程式的資料和設定檔。
Tauri 的核心設計理念之一就是安全性。對於檔案系統這種敏感的操作,Tauri 預設並不會讓你有權限讀寫任意位置的檔案。你必須在應用程式的 capabilities 中明確設定你的「權限範圍 (Scope)」。
之前在 Day 11 有介紹過 capabilities,這邊就簡單帶過~
這是一個允許讀寫應用程式資料目錄下所有檔案的設定範例:
{
"permissions": [
"fs:default",
{
"identifier": "fs:scope",
"allow": ["$APPDATA/*", "$DESKTOP/*"]
}
]
}
在這個設定中:
fs:default
: 提供檔案系統操作的基本權限集,包含常用的讀寫操作。fs:scope
: 定義了插件可以存取的路徑範圍。$DESKTOP/*
代表允許存取桌面目錄下的任何檔案 (允許所有 fs
操作)。你也可以設定更精確的路徑,例如 $DESKTOP/config.json
。其他如同 $APPDATA
的變數資訊可以參考文件。也可以把 fs:scope
改成更精確的權限,例如:fs:allow-read-text-file
。如果沒有設定 Scope,所有檔案系統的操作都會被拒絕。 這是 Tauri 為了保護使用者所做的重要防線。
再次強調,
$DESKTOP/*
不包含子目錄,如果要全部都包含,請使用$DESKTOP/**/*
。
除了權限範圍的限制外,tauri-plugin-fs
還內建了路徑遍歷攻擊的防護機制。此模組會阻止路徑遍歷,不允許使用父目錄存取符號(例如 /usr/path/to/../file
或 ../path/to/file
這類路徑都會被拒絕)。這項安全特性能有效防止惡意程式碼透過相對路徑來存取應用程式權限範圍外的檔案系統區域。
在行動裝置(Android/iOS)上,檔案系統的權限管理變得更加嚴格。作業系統本身就有沙箱機制,每個應用程式只能存取自己私有的儲存空間。
當你在 Tauri 中使用 tauri-plugin-fs
時,BaseDirectory
在行動裝置上會對應到系統建議的應用程式私有目錄。這意味著你不太需要擔心會不小心存取到其他應用程式的資料。
然而,如果你的應用程式需要存取公共目錄(例如相簿、下載資料夾),那就必須處理 Android 的執行時權限 (Runtime Permissions)。這通常需要整合其他插件或原生程式碼來向使用者請求權限。tauri-plugin-fs
本身專注於應用程式範圍內的檔案操作,對於需要使用者明確授權的公共空間存取,則需要更進一步的處理。
tauri-plugin-fs
透過 BaseDirectory
和 Scope
機制,在賦予我們檔案操作能力的同時,也確保了應用程式的行為在可控範圍內,為使用者提供了更安全的體驗。