ClickOnceによる更新でローカルデータを引き継ぐ方法 その2

こちらのmars12号さんのblogで知ったのですが、以前書いた分離ストレージを使う方法よりももっと手軽な方法があったんですね。

http://mars.skr.jp/nucleus/index.php?itemid=190&catid=8

MSDNライブラリの下記のページに書かれています。

ClickOnce アプリケーションにおけるローカル データおよびリモート データへのアクセス



簡単にまとめてみますと、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


確認してみますと、きちんと以前のバージョンのデータファイルを引き継ぐことができています。
というわけで、普通はこちらの方法を使い、部分信頼が必要なアプリケーションの場合は分離ストレージを使うということになりそうです。