タスク2 当該アプリケーション向けのアップデートがあるかどうか確認する
........... XMLFunction.OpenXMLDoc(Updaterfile) XMLFunction.XMLSNode("/updates") TotalUpdates = Val(XMLFunction.GetNodeVal("total")) If TotalUpdates > LastUpdate Then .............
ここでは、タスク2(アップデートがあるかどうかの確認)を行っています。XMLファイルには複数のデータ項目があり、ファイルをリストに追加するとき、そのアップデート番号を1ずつインクリメントします。アップデートされた各ファイルに、このアップデート番号が与えられ、アプリケーションは各ファイルがどのアップデートに対応するものかを知るというわけです。ファイル内の最終アップデートとアップデート番号を比較することにより、そのファイルのダウンロードが必要かどうかを判断することができます。
............. FileList = XMLFunction.GetFiles For Each ThisFile As XMLFunc.XmlFunctions.FileDetails In FileList If ThisFile.Update > LastUpdate Then Updaterfile = AppPath & "\" & ThisFile.Local Serverfile = "http://" & UpdateSite & "/" _ & ThisFile.Server LblText.Text = "Downloading " & ThisFile.File & _ " from server" & vbCrLf & " Please wait for update to complete" GBLbl.Refresh() If File.Exists(Updaterfile) Then File.Delete(Updaterfile) My.Computer.Network.DownloadFile(Serverfile, Updaterfile) End If Next End If ...............
タスク3 必要なファイルを、それぞれ対応する場所にダウンロードする
新しいアップデートがあるとわかった場合は、タスク3(ファイルのダウンロードとインストール)を行います。各ファイルは番号で特定のアップデートと関連付けられているので、個々のファイルをループで反復的に処理し、そこで指定されているアップデートが読み込まれていないか確認するだけで済みます。この方法には1回のセッションで複数のアップデートをダウンロードできるメリットもあります。また、複数のアップデートに同じファイルが含まれている場合、開発者が常にそのファイルのオリジナルのエントリを編集して最終アップデート番号を設定するようにすれば、ユーザーが無駄なアップデートをダウンロードしなくて済むので帯域幅の節約にもなります。
XMLのサンプルを見ると、サーバファイルの拡張子とターゲットファイルの拡張子が違ってることに気づきます。Webホスティングサーバによっては、一部のファイル拡張子がローカルなデータと見なされ、それをダウンロードするHTTP要求がブロックされることがあるからです。これは主としてサーバのセキュリティを考慮した措置です。サーバを攻撃にさらされないようにするために、ファイルに対してダウンロードしても安全と考えられている名前を与え、それを保存するときはオリジナルの名前を使用します。DATファイルのダウンロードはサーバによってブロックされます。これには複数のプロジェクトのファイルを同じサーバに格納できるメリットもあり、その場合、複数のプロジェクトの同名のファイルの間に交雑親和性がないことを特に意識しなくて済みます。
............... If Updated Then LblText.Text = "Update succesfully installed." & vbCrLf & _ "Application will Exit in a few seconds" LastUpdate = TotalUpdates Else LblText.Text = "No Updates to load." & vbCrLf & _ "Application will Exit in a few seconds" End If Catch ex As Exception LblText.Text = "Error during download" & vbCrLf & _ "Application will Exit in a few seconds" End Try TimeOut = False TimeDelay = 10 Timer.Interval = 1000 Timer.Enabled = True Retry = False Button3.Enabled = False Button4.Enabled = True While Not (TimeOut Or Canceled) System.Windows.Forms.Application.DoEvents() End While End If LoadApp() End Sub
タスク4 アップデート後のアプリケーションを開始する
最後に、ユーザーに結果を通知し、メインアプリケーションを開始します。最終アップデートをシステムのファイルまたはレジストリに格納する必要があることも忘れないでください。
オートアップデータには、ここで述べた以外にも、多くのもっと高度な機能を与えることができます。しかし、プロジェクトをできるだけ単純化し、バグの発生を可能な限り抑えることを基本とすべきです。残念ながら、このオートアップデータ自体をアップデートすることはできないからです。
おわりに
この簡単なベースコードをプロジェクトに付加することで、クライアント/ユーザーに対するアップデートの配信機能を大きく改善でき、多くの人々が求めている価値を付加することになります。