MESCIUS JPAddress for WPF 3.0J
実行環境での辞書ファイルの更新

JPAddress では、任意の Web サイトあるいはネットワークフォルダに配置された辞書ファイルをダウンロードし、アプリケーションが参照する辞書ファイルを更新するための機能が用意されています。この機能を使用して、アプリケーションが参照する辞書ファイルを更新する方法について説明します。

辞書ファイルの配置場所を指定する

DownloadUrl 静的プロパティに、辞書ファイルが配置されている場所を指定します。配置場所によって、それぞれ以下のような形式で設定します(パス名などは一例です)。

' Webサイトからダウンロードする場合
GrapeCity.Windows.JPAddress.GcJPAddress.DownloadUrl = "https://tempuri.com/data/"

' ネットワークフォルダからダウンロードする場合
GrapeCity.Windows.JPAddress.GcJPAddress.DownloadUrl = "\\tempsrv\data"
// Webサイトからダウンロードする場合
GrapeCity.Windows.JPAddress.GcJPAddress.DownloadUrl = "https://tempuri.com/data/";

// ネットワークフォルダからダウンロードする場合
GrapeCity.Windows.JPAddress.GcJPAddress.DownloadUrl = @"\\tempsrv\data";

また、DownloadUrl 静的プロパティで直接指定する代わりに、app.config にて配置場所を指定することができます。サーバー側の辞書ファイルの保存先が変更になった場合は、app.config を編集することで、プロジェクトをリビルドせずに変更を反映できます。

<!-- Webサイトからダウンロードする場合 -->
<configuration>
  <appSettings>
    <add key="DownloadUrl" value="https://tempuri.com/data/" />
  </appSettings>
</configuration>

<!-- ネットワークフォルダからダウンロードする場合 -->
<configuration>
  <appSettings>
    <add key="DownloadUrl" value="\\tempsrv\data" />
  </appSettings>
</configuration>

プロキシの設定

Web サイトからダウンロードする場合は、必要に応じて Proxy プロパティを使用してプロキシの設定を行います。

既定では、次のコードで設定した場合と同様に、現在のユーザーのインターネット設定におけるプロキシおよび資格情報を使用します。

    GcJPAddress1.Proxy = System.Net.WebRequest.GetSystemWebProxy()
    GcJPAddress1.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials
    gcJPAddress1.Proxy = System.Net.WebRequest.GetSystemWebProxy();
    gcJPAddress1.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;

任意のプロキシや資格情報を使用したい場合には、下記のように Proxy プロパティを設定します。

    GcJPAddress1.Proxy = New System.Net.WebProxy("http://your-proxy-server:8080", True)
    GcJPAddress1.Proxy.Credentials = New System.Net.NetworkCredential("user", "password", "domain")
    gcJPAddress1.Proxy = new System.Net.WebProxy("http://your-proxy-server:8080", true);
    gcJPAddress1.Proxy.Credentials = new System.Net.NetworkCredential("user", "password", "domain");
タイムアウト値の変更

JPAddress では、ダウンロード処理のタイムアウト時間が 30 秒に設定されています。タイムアウトの設定値は Timeout プロパティでミリ秒単位で変更可能です。

    ' タイムアウトまでの時間を10秒に変更します。
    GcJPAddress1.Timeout = 10000
    // タイムアウトまでの時間を10秒に変更します。
    gcJPAddress1.Timeout = 10000;
辞書ファイルの更新処理の実装

辞書ファイルの更新には、同期処理で更新を行う Update メソッドと、非同期処理で更新を行う UpdateAsync メソッドの2種類が用意されています。

既定の設定で更新処理を実行する場合は、引数なしのオーバーロードメソッドを使用します。

' 既定の設定で辞書ファイルを更新します。
' 既定のフォルダにある辞書ファイルが更新対象となります。
' 辞書の配置フォルダにGcJPAddressBackupフォルダが作成され、既存の辞書ファイルがバックアップされます。
GcJPAddress1.Update()
// 既定の設定で辞書ファイルを更新します。
// 既定のフォルダにある辞書ファイルが更新対象となります。
// 辞書の配置フォルダにGcJPAddressBackupフォルダが作成され、既存の辞書ファイルがバックアップされます。
gcJPAddress1.Update();

更新処理をカスタマイズする場合は、引数を3つ指定する Update メソッドのオーバーロードメソッドを使用します。それぞれの引数の設定内容は以下の通りです。

引数名 説明
jpAddressDatabaseFilesWokingFolder 辞書ファイルを更新する際の作業フォルダを指定します。
既定の[%CommonApplicationData%]\MESCIUS\JPAddressフォルダにある辞書データを直接更新するのではなく、一旦作業フォルダで更新処理を行う場合に使用します。
既定の動作のままとする場合は、String.Empty値を指定してください。
needBackupOldJPAddressDatabaseFiles 辞書ファイルの更新時に、更新前の辞書ファイルをバックアップするかどうかを指定します。
バックアップの作成が不要な場合はFalse値を指定してください。
jpAddressDatabaseFilesBackupFolder バックアップファイルの保存先フォルダを指定します。既定のGcJPAddressBackupフォルダ以外の場所にバックアップファイルを作成する場合に使用します。
既定の動作のままとする場合は、String.Empty値を指定してください。

既定の辞書ファイルを更新し、バックアップの作成が不要な場合は、以下のコードを実行します。

    ' 辞書ファイルをバックアップなしで更新します。
    GcJPAddress1.Update(String.Empty, False, String.Empty)
    // 辞書ファイルをバックアップなしで更新します。
    gcJPAddress1.Update(String.Empty, false, String.Empty);

既定の辞書ファイルを更新し、指定した場所にバックアップを作成する場合は、以下のコードを実行します。

    ' 辞書ファイルを[D:\MyData\JPAddress]フォルダにバックアップして更新します。
    GcJPAddress1.Update(String.Empty, True, "D:\MyData\JPAddress")
    // 辞書ファイルを[D:\MyData\JPAddress]フォルダにバックアップして更新します。
    gcJPAddress1.Update(String.Empty, true, "D:\\MyData\\JPAddress");

指定されたフォルダにある辞書ファイルを更新し、指定した場所にバックアップを作成する場合は、以下のコードを実行します。

    ' [D:\MyData\JPAddress]フォルダの辞書ファイルを更新し、[D:\MyData\JPAddress\Backup]フォルダにバックアップして更新します。
    GcJPAddress1.Update("D:\MyData\JPAddress", True, "D:\MyData\JPAddress\Backup")
    // [D:\MyData\JPAddress]フォルダの辞書ファイルを更新し、[D:\MyData\JPAddress\Backup]フォルダにバックアップして更新します。
    gcJPAddress1.Update("D:\\MyData\\JPAddress", true, "D:\\MyData\\JPAddress\\Backup");
更新中のイベントを処理する

ダウンロード処理が開始されるときには DownloadStarting イベントが発生します。

イベントデータからは、次の情報を取得することが可能です。

プロパティ 説明
Cancel 辞書ファイルの更新日付チェックの結果によって、イベントをキャンセルするかどうかを示す値。辞書更新サービスサーバーのファイルが現在の辞書ファイルよりも新しく更新が必要な場合は false、現在の辞書ファイルの方が同じか新しく更新が不要な場合は true。
CurrentDataBaseWriteTimeUtc 現在の辞書ファイルの更新日時を取得します。
DownloadFile ダウンロードする辞書ファイルの情報を取得します。ファイル名やサイズ、更新日付の情報が取得可能です。

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' DownloadStartingイベントを追加します。
        AddHandler GcJPAddress1.DownloadStarting, AddressOf GcJPAddress1_DownloadStarting
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ' 実行フォルダにある辞書ファイルを更新します。
        GcJPAddress1.Update()
    End Sub

    Private Sub GcJPAddress1_DownloadStarting(sender As Object, e As GrapeCity.Windows.JPAddress.DownloadStartingEventArgs)
        ' 現在のファイルが最新の場合は更新をキャンセルします。
        If e.Cancel Then
            MessageBox.Show("辞書ファイルは最新です。ダウンロードをキャンセルします。")
            Exit Sub
        End If
    End Sub
    private void Form1_Load(object sender, EventArgs e)
    {
        // DownloadStartingイベントを追加します。
        gcJPAddress1.DownloadStarting += gcJPAddress1_DownloadStarting;
    }

    private void button1_Click(object sender, System.EventArgs e)
    {
        // 実行フォルダにある辞書ファイルを更新します。
        gcJPAddress1.Update();
    }
    
    private void gcJPAddress1_DownloadStarting(object sender, GrapeCity.Windows.JPAddress.DownloadStartingEventArgs e)
    {
        // 現在のファイルが最新の場合は更新をキャンセルします。
        if (e.Cancel)
        {
            MessageBox.Show("辞書ファイルは最新です。ダウンロードをキャンセルします。");
            return;
        }
    }

更新処理が完了したときには、UpdateCompleted イベントが発生します。

イベントデータからは、次のエラー情報を取得できます。

プロパティ 説明
Error 更新処理中に発生したエラーの情報を取得します。エラーが発生しなかった場合には null 参照(Visual Basic では Nothing) です。

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' UpdateCompletedイベントを追加します。
        AddHandler GcJPAddress1.UpdateCompleted, AddressOf GcJPAddress1_UpdateCompleted
    End Sub

    Private Sub GcJPAddress1_UpdateCompleted(sender As Object, e As GrapeCity.Windows.JPAddress.UpdateCompletedEventArgs)
        ' e.ErrorがNothingの場合は正常終了
        If e.Error Is Nothing Then
            MessageBox.Show("更新処理は正常に完了しました。")
        Else
            MessageBox.Show("更新処理でエラーが発生しました。" + e.Error.Message)
        End If
    End Sub
    private void Form1_Load(object sender, EventArgs e)
    {
        // UpdateCompletedイベントを追加します。
        gcJPAddress1.UpdateCompleted += gcJPAddress1_UpdateCompleted;
    }

    private void gcJPAddress1_UpdateCompleted(object sender, GrapeCity.Windows.JPAddress.UpdateCompletedEventArgs e)
    {
        ' e.Errorがnullの場合は正常終了
        if (e.Error == null)
        {
            MessageBox.Show("更新処理は正常に完了しました。");
        }
        else
        {
            MessageBox.Show("更新処理でエラーが発生しました。" + e.Error.Message);
        }
    }

非同期で更新処理を行ったときには、上記2つのイベントに加えて DownloadProgressChangedイベントと DownloadCompleted イベントが発生します。

進行状況や受信情報の取得を行いたいときには、これらのイベントを利用する方法があります。

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' DownloadProgressChangedイベントを追加します。
        AddHandler GcJPAddress1.DownloadProgressChanged, AddressOf GcJPAddress1_DownloadProgressChanged
    End Sub

    Private Sub GcJPAddress1_DownloadProgressChanged(sender As Object, e As Net.DownloadProgressChangedEventArgs)
        ' 進捗情報の表示
        ListBox1.Items.Add("非同期ダウンロード" + e.ProgressPercentage.ToString() + "%完了")
    End Sub
    private void Form1_Load(object sender, EventArgs e)
    {
        // DownloadProgressChangedイベントを追加します。
        gcJPAddress1.DownloadProgressChanged += gcJPAddress1_DownloadProgressChanged;
    }

    private void gcJPAddress1_DownloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e)
    {
        // 進捗情報の表示
        ListBox1.Items.Add("非同期ダウンロード" + e.ProgressPercentage.ToString() + "%完了");
    }
バックアップファイルでロールバックする

更新のオプションで現在の辞書ファイルをバックアップしていた場合、Rollback メソッドを使用して辞書ファイルをロールバックすることが可能です。

辞書ファイルは、GZIP 形式で圧縮された .gz ファイルとしてバックアップされます。ロールバックの際は、このファイルを指定します。

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim Ofd As OpenFileDialog = New OpenFileDialog()
        If String.IsNullOrEmpty(Ofd.InitialDirectory) Then
            Ofd.InitialDirectory = Directory.GetCurrentDirectory()

        End If
        Ofd.Filter = "辞書ファイル書庫 (*.gz)|*.gz"
        Ofd.RestoreDirectory = True

        If Ofd.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
            Dim Result As DialogResult = MessageBox.Show("辞書ファイルをファイル" + Path.GetFileName(Ofd.FileName) + "でロールバックします。続行しますか?", _
                "ロールバックの確認", MessageBoxButtons.YesNo)
            If Result = DialogResult.Yes Then
                Try
                    MessageBox.Show("ロールバックを開始します。")
                    GcJPAddress1.Rollback(Ofd.FileName, String.Empty)
                    MessageBox.Show("ロールバックが完了しました。")
                Catch ex As Exception
                    MessageBox.Show(ex.Message)
                Finally
                End Try
            End If
        End If
    End Sub
    private void button1_Click(object sender, EventArgs e)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        if (string.IsNullOrEmpty(ofd.InitialDirectory))
        {
            ofd.InitialDirectory = Directory.GetCurrentDirectory();
        }
        ofd.Filter = "辞書ファイル書庫 (*.gz)|*.gz";
        ofd.RestoreDirectory = true;

        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            DialogResult result = MessageBox.Show("辞書ファイルをファイル" + Path.GetFileName(ofd.FileName) + "でロールバックします。続行しますか?",
                "ロールバックの確認", MessageBoxButtons.YesNo);

            if (result == DialogResult.Yes)
            {
                try
                {
                    MessageBox.Show("ロールバックを開始します。");
                    gcJPAddress1.Rollback(ofd.FileName, string.Empty);
                    MessageBox.Show("ロールバックが完了しました。");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                finally
                {
                }
            }
        }    
    }

ロールバック処理を行った際、バックアップファイルは自動では削除されません。

関連トピック

 

 


© MESCIUS inc. All rights reserved.