ClickOnceによる更新でローカルデータを引き継ぐ方法
ClickOnceによる配置では、インストールするフォルダを指定することはできません。「%SYSTEMDRIVE%\Documents and Settings\<ユーザー名>\Local Settings\Apps\2.0」の下にフォルダが作成され、インストールされます。新しいバージョンが発行された場合、同じフォルダに更新されたファイルがダウンロードされてくるわけではなく、新しいバージョンのフォルダにすべてのファイルがインストールされます。これは、元のバージョンに戻すことができなければいけないので、当然といえば当然です。
ですが、この場合アプリケーションと同じフォルダにローカルデータとして保存するという手法は使えません。アップデートすると保存していたローカルデータを使用することができなくなってしまいます。
そこで、分離ストレージを使います。ノータッチデプロイメントのときはクライアントリソースへのアクセス制限を回避するために分離ストレージを使いましたが、ClickOnceでは異なるバージョンの同一アプリケーション内でデータを共有するために分離ストレージを使います。
少し前のid:kazzzさんの日記に、分離ストレージのApplication Scopeのことが書かれています。
簡単なアプリケーションを作成し、確認してみました。
Imports System.IO
Imports System.IO.IsolatedStorage
Public Class Form1
Private isoStore As IsolatedStorageFile
' isoStoreTest.txtが分離ストレージにあればそれを読み込む
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' アプリケーションIDに対応するユーザースコープの分離ストレージを使用する
isoStore = IsolatedStorageFile.GetUserStoreForApplication
Dim fileNames As String() = isoStore.GetFileNames("isoStoreTest.txt")
If fileNames.Length = 1 Then
'isoStoreTest.txtをShift-JISエンコーディングで開く
Dim sr As New System.IO.StreamReader(New IsolatedStorageFileStream("isoStoreTest.txt", FileMode.Open, isoStore), _
System.Text.Encoding.GetEncoding(932))
'内容をすべて読み込む
TextBox1.Text = sr.ReadToEnd()
'閉じる
sr.Close()
End If
End Sub
' 分離ストレージにisoStoreTest.txtを書き込む
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' ファイルを上書きし、Shift JISエンコーディングで書き込む
Dim sw As New StreamWriter(New IsolatedStorageFileStream("isoStoreTest.txt", FileMode.Create, isoStore), _
System.Text.Encoding.GetEncoding(932))
' TextBox1.Textの内容をすべて書き込む
sw.Write(TextBox1.Text)
' 閉じる
sw.Close()
End Sub
End Class
ボタンを押すとテキストボックスに入力されている文字列をテキストファイルとして保存し、アプリケーションの起動時にそのテキストファイルを読み込んでテキストボックスに表示するという単純なものです。これを下記のような順序で確認します。
Imports System.IO.IsolatedStorage
Public Class Form1
Private isoStore As IsolatedStorageFile
' isoStoreTest.txtが分離ストレージにあればそれを読み込む
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' アプリケーションIDに対応するユーザースコープの分離ストレージを使用する
isoStore = IsolatedStorageFile.GetUserStoreForApplication
Dim fileNames As String() = isoStore.GetFileNames("isoStoreTest.txt")
If fileNames.Length = 1 Then
'isoStoreTest.txtをShift-JISエンコーディングで開く
Dim sr As New System.IO.StreamReader(New IsolatedStorageFileStream("isoStoreTest.txt", FileMode.Open, isoStore), _
System.Text.Encoding.GetEncoding(932))
'内容をすべて読み込む
TextBox1.Text = sr.ReadToEnd()
'閉じる
sr.Close()
End If
End Sub
' 分離ストレージにisoStoreTest.txtを書き込む
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' ファイルを上書きし、Shift JISエンコーディングで書き込む
Dim sw As New StreamWriter(New IsolatedStorageFileStream("isoStoreTest.txt", FileMode.Create, isoStore), _
System.Text.Encoding.GetEncoding(932))
' TextBox1.Textの内容をすべて書き込む
sw.Write(TextBox1.Text)
' 閉じる
sw.Close()
End Sub
End Class