ClickOnceによる更新でローカルデータを引き継ぐ方法 その2
こちらのmars12号さんのblogで知ったのですが、以前書いた分離ストレージを使う方法よりももっと手軽な方法があったんですね。
MSDNライブラリの下記のページに書かれています。
簡単にまとめてみますと、ClickOnceアプリケーションにはデータディレクトリというものがあり、ここのパスはApplicationDeploymentクラスのCurrentDeploymentプロパティで定義されるDataDirectoryプロパティを使用して取得することができる。
アプリケーションの新しいバージョンをインストールすると、前のバージョンのデータディレクトリから新しいバージョンのデータ ディレクトリに、ファイルがすべてコピーされるそうです。
では、例によってこの方法を実現する最小限のコードを書いてみました。
Visual Basic
Imports System.IO
Imports System.Deployment.Application
Public Class Form1
Dim myPath As String = ApplicationDeployment.CurrentDeployment.DataDirectory.ToString + "\appDataDirTest.txt"
' 読み込む
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' ファイルが既に存在する場合
If System.IO.File.Exists(myPath) Then
' Shift-JISエンコーディングでテキストファイルを開く
Dim sr As New System.IO.StreamReader(myPath, System.Text.Encoding.GetEncoding(932))
' 内容をすべて読み込む
TextBox1.Text = sr.ReadToEnd()
' 閉じる
sr.Close()
End If
End Sub
' 書き込む
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
' ファイルを上書きする
Dim sw As New StreamWriter(myPath, False, System.Text.Encoding.GetEncoding(932))
' TextBox1.Textの内容をすべて書き込む
sw.Write(TextBox1.Text)
' 閉じる
sw.Close()
End Sub
End Class
Imports System.Deployment.Application
Public Class Form1
Dim myPath As String = ApplicationDeployment.CurrentDeployment.DataDirectory.ToString + "\appDataDirTest.txt"
' 読み込む
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' ファイルが既に存在する場合
If System.IO.File.Exists(myPath) Then
' Shift-JISエンコーディングでテキストファイルを開く
Dim sr As New System.IO.StreamReader(myPath, System.Text.Encoding.GetEncoding(932))
' 内容をすべて読み込む
TextBox1.Text = sr.ReadToEnd()
' 閉じる
sr.Close()
End If
End Sub
' 書き込む
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
' ファイルを上書きする
Dim sw As New StreamWriter(myPath, False, System.Text.Encoding.GetEncoding(932))
' TextBox1.Textの内容をすべて書き込む
sw.Write(TextBox1.Text)
' 閉じる
sw.Close()
End Sub
End Class
確認してみますと、きちんと以前のバージョンのデータファイルを引き継ぐことができています。
というわけで、普通はこちらの方法を使い、部分信頼が必要なアプリケーションの場合は分離ストレージを使うということになりそうです。