在 Silverlight 4 中使用 IsolatedStorageFile 寫入檔案,若指定完整路徑(如 C:\Users\...\Projects\File1.txt),會拋出 Operation not permitted on IsolatedStorageFileStream 例外;僅使用檔名(如 File1.txt)則正常運作。
Silverlight 獨立存儲 設計為沙箱機制,僅允許在應用程式專屬的虛擬儲存區內讀寫,完全隔離真實檔案系統路徑。開發者無法指定、也無法得知實體儲存位置。這是安全性設計,防止惡意程式存取使用者任意檔案。
IsolatedStorageFile.GetUserStoreForApplication() 回傳的存儲區為每應用程式、每使用者獨立的邏輯空間。IsolatedStorageFileStream 建構函式的 path 參數只接受相對路徑(虛擬目錄結構),不接受絕對路徑。System.IO.Path.Combine 產生的絕對路徑會直接拋出 IsolatedStorageException。using (var store = IsolatedStorageFile.GetUserStoreForApplication())
using (var stream = store.OpenFile("MyData\\File1.txt", FileMode.Create))
using (var writer = new StreamWriter(stream))
{
writer.Write(txtContents.Text);
}
檔案實際儲存在 %LocalAppData%\Microsoft\Silverlight\is\...\[隨機資料夾]\MyData\File1.txt,但程式碼不需知道實體路徑。
var dlg = new SaveFileDialog
{
Filter = "文字檔 (*.txt)|*.txt|所有檔案 (*.*)|*.*",
DefaultFileName = "File1.txt"
};
if (dlg.ShowDialog() == true)
{
using (var stream = dlg.OpenFile())
using (var writer = new StreamWriter(stream))
{
writer.Write(txtContents.Text);
}
}
此方式需使用者互動,但可儲存至任意使用者可存取的資料夾(文件、桌面等)。
System.IO.File 存取任意路徑(需信任權限)。StorageFile、FileOpenPicker、FutureAccessList 管理權限。注意:Silverlight 已於 2021 年 10 月停止支援,新專案強烈建議遷移至現代技術棧。
| 誤區 | 事實 |
|---|---|
| 以為 IsolatedStorage 只是權限問題,提權即可指定路徑 | 架構上完全禁止,無法透過任何設定繞過 |
| 想在獨立存儲建立子目錄對應真實資料夾 | 虛擬目錄僅存在於隔離存儲內部,不對應真實路徑 |
| 試圖用 Reflection 存取內部欄位取得真實路徑 | 受安全性透明度限制,且路徑可能加密/雜湊,無實際意義 |
Silverlight 獨立存儲原設計即不支援指定實體路徑。若僅需應用內部持久化,請使用相對虛擬路徑;若需使用者可見的檔案,請改用 SaveFileDialog;若專案仍在維護中,規劃遷移至 WPF/UWP/MAUI 以獲得完整檔案系統存取能力。