運用 Isolated Storage 儲存不同使用層級的共用或臨時資料

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 這裡。不同的輸入,實際檔案會出現在伺服器的不同地方。以下我把對照表列出來:

  1. IsolatedStorageFile.GetUserStoreForDomain -
    C:\Documents and Settings\Johnny\Local Settings\Application Data\IsolatedStorage\o3udtum0.3ys\uxcbgmas.ygh\StrongName.uouswt0ikg5nqnmq0szp44xajdcyl212\Url.mfjr2hwg0bmuvgdmhp3akvxa1p4zpy2r\Files
    (同一 Domain 的所有造訪者都讀寫同一個檔案)
     
  2. IsolatedStorageFile.GetUserStoreForAssembly -
    C:\Documents and Settings\Johnny\Local Settings\Application Data\IsolatedStorage\o3udtum0.3ys\uxcbgmas.ygh\StrongName.uouswt0ikg5nqnmq0szp44xajdcyl212\Url.km3zydig3xzyeyrebx43wkbef2kgouea\Files
    (同一網頁的所有造訪者都讀寫同一個檔案)
     
  3. IsolatedStorageFile.GetUserStoreForApplication -
    會跳出以下錯誤:Unable to determine application identity of the caller.
     
  4. IsolatedStorageFile.GetMachineStoreForDomain -
    C:\Documents and Settings\All Users\Application Data\IsolatedStorage\uhtslxrd.fhp\ofn5dfa1.zsz\StrongName.uouswt0ikg5nqnmq0szp44xajdcyl212\Url.wmpu1co2wyk21klphepxwvffevdwz4nj\Files
    (同一伺服器、同一 Domain 的所有造訪者都讀寫同一個檔案)
     
  5. IsolatedStorageFile.GetMachineStoreForAssembly -
    C:\Documents and Settings\All Users\Application Data\IsolatedStorage\uhtslxrd.fhp\ofn5dfa1.zsz\Url.qc3vavu3ibaejzjvjcou5pkhkzgqb223\AssemFiles
    (同一伺服器、同一網頁的所有造訪者都讀寫同一個檔案)
     
  6. 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! 所開發的應用程式。


Dev 2Share @ 點部落