Isolated Storage 是 .NET Framework 2.0 新增的玩意,主要目的在於保證取得系統中適當存取權限的一塊空間,以供儲存檔案與資料夾之用。由於它主要是被拿來與 Windows Form,尤其是搭配 ClickOnce! 的應用程式一起使用,所以對於設計網頁的人來講,這個議題十分冷門...
Isolated Storage 是 .NET Framework 2.0 新增的玩意,主要目的在於保證取得系統中適當存取權限的一塊空間,以供儲存檔案與資料夾之用。由於它主要是被拿來與 Windows Form,尤其是搭配 ClickOnce! 的應用程式一起使用,所以對於設計網頁的人來講,這個議題十分冷門。坦白說,在 .NET 2.0 出現之後,我還從沒看過有人在討論這個話題。
不要以為設計 Web Form 的人用不到 Isolated Storage,它在網站應用中其實和 Win Form 裡面一樣好用!只不過在某些地方,它的行為和 Win Form 有一些差異,這就是我現在要講的。
當你使用 IsolatedStorageFile.GetUserStoreForAssembly() 向系統要求一個住於 Isolated Storage 中的檔案物件之後,你會得到一個保證可以自由寫入與讀取檔案、不受系統權限影響的硬碟位置。你可以接著建立一個 IsolatedStorageFileStream 物件,再使用 StreamWriter 或 StreamReader 物件以寫入或讀取檔案的內容。
以下是一個簡單的範例:
Imports System.IO
Imports System.IO.IsolatedStorage
Partial Class _Default
Inherits System.Web.UI.Page
Dim userStore As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForDomain
Const fileName As String = "UserSettings.set"
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
If Trim(TextBox1.Text) <> String.Empty Then
Dim userStream As IsolatedStorageFileStream = New IsolatedStorageFileStream(fileName, IO.FileMode.OpenOrCreate, userStore)
Dim userWriter As New StreamWriter(userStream)
userWriter.WriteLine(TextBox1.Text)
userWriter.Close()
End If
End Sub
Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim files() As String = userStore.GetFileNames(fileName)
If files.Length = 0 Then
Label1.Text = "No data"
Else
Dim userStream As IsolatedStorageFileStream = New IsolatedStorageFileStream(fileName, IO.FileMode.Open, userStore)
Dim userReader As StreamReader = New StreamReader(userStream)
Label1.Text = userReader.ReadToEnd
userReader.Close()
End If
End Sub
End Class
你可以測試一下這個程式。先在 TextBox1 中鍵入幾個字,按 Button1 寫入檔案,再按 Button2 讀出,看看 Label1 的內容符不符合 TextBox1 的文字。
所有的問題都在 IsolatedStorageFile.GetXXX 這裡。不同的輸入,實際檔案會出現在伺服器的不同地方。以下我把對照表列出來:
-
IsolatedStorageFile.GetUserStoreForDomain -
C:\Documents and Settings\Johnny\Local Settings\Application Data\IsolatedStorage\o3udtum0.3ys\uxcbgmas.ygh\StrongName.uouswt0ikg5nqnmq0szp44xajdcyl212\Url.mfjr2hwg0bmuvgdmhp3akvxa1p4zpy2r\Files
(同一 Domain 的所有造訪者都讀寫同一個檔案)
-
IsolatedStorageFile.GetUserStoreForAssembly -
C:\Documents and Settings\Johnny\Local Settings\Application Data\IsolatedStorage\o3udtum0.3ys\uxcbgmas.ygh\StrongName.uouswt0ikg5nqnmq0szp44xajdcyl212\Url.km3zydig3xzyeyrebx43wkbef2kgouea\Files
(同一網頁的所有造訪者都讀寫同一個檔案)
-
IsolatedStorageFile.GetUserStoreForApplication -
會跳出以下錯誤:Unable to determine application identity of the caller.
-
IsolatedStorageFile.GetMachineStoreForDomain -
C:\Documents and Settings\All Users\Application Data\IsolatedStorage\uhtslxrd.fhp\ofn5dfa1.zsz\StrongName.uouswt0ikg5nqnmq0szp44xajdcyl212\Url.wmpu1co2wyk21klphepxwvffevdwz4nj\Files
(同一伺服器、同一 Domain 的所有造訪者都讀寫同一個檔案)
-
IsolatedStorageFile.GetMachineStoreForAssembly -
C:\Documents and Settings\All Users\Application Data\IsolatedStorage\uhtslxrd.fhp\ofn5dfa1.zsz\Url.qc3vavu3ibaejzjvjcou5pkhkzgqb223\AssemFiles
(同一伺服器、同一網頁的所有造訪者都讀寫同一個檔案)
-
IsolatedStorageFile.GetMachineStoreForApplication -
會跳出以下錯誤:Unable to determine application identity of the caller.
以上是在 Windows XP Professional 的測試結果,若在 Windows 2003,其位置可能會有所不同。此外,若你寫的是 Win Form,其位置也會有些不同。
此外,我們可以看到使用 GetMachineStoreForApplication 和 IsolatedStorageFile.GetUserStoreForApplication 都會產生 Compile-time 的錯誤。這是因為我寫的是 Web Form,而這兩個選項僅適用於以 ClickOnce! 所開發的應用程式。