バックグラウンドによるファイル転送(後編)

2011年9月12日(月)
PROJECT KySS

ソリューションエクスプローラー内のAddBackGropundTransfer.xamlを展開して表示される、AddBackGropundTransfer.xaml.vbをダブルクリックして、リスト2のコードを記述します。

ロジックコードを記述する

リスト2 (AddBackGroundTransfer.xaml.vb)

Option Strict On
Imports Microsoft.Phone.Controls

Windows Phone上のバック グラウンドで、ファイル転送を有効にするAPI へのアクセスを提供する、Microsoft.Phone.BackgroundTransfer名前空間をインポートします。
Imports Microsoft.Phone.BackgroundTransfer

仮想ファイル システムを作成および使用するためのクラスが含まれている、System.IO.IsolatedStorage名前空間をインポートします。
Imports System.IO.IsolatedStorage

Imports System.Xml.Linq

ImageInfoクラス内に文字列型のabsoluteUriプロパティを定義します。
Public Class ImageInfo
  Property absoluteUri As String
End Class
Partial Public Class AddBackGroundTransfer
  Inherits PhoneApplicationPage
 
  Public Sub New()
    InitializeComponent()
  End Sub

ページが読み込まれた時の処理

XElement.LoadメソッドでXML文書ファイル(absoluteUri.xml)を読み込みます。ImageInfoクラス型の新しいリストであるmyImageInfoオブジェクト変数を宣言します。
<ImageName>要素のコレクション内を、変数resultで反復処理しながら、ImageInfoクラスのabsoluteUriプロパティに、<ImageName>要素の値を指定し、AddメソッドでmyImageInfoオブジェクトに追加していきます。ListBoxのItemsSourceプロパティにmyImageInfoオブジェクトを指定します。これで、ListBoxコントロール内に、転送するファイルの絶対URIと+の[追加]ボタンが表示されます。
変数isolateを、ファイルとディレクトリを格納している分離ストレージ領域を表すIsolateStorageFileクラスとして宣言し、呼び出し元のコードのアプリケーションIDに対応する、ユーザースコープの分離ストレージを取得します。
DirectoryExistsメソッドで、指定したパス(/shared/transfers)、が分離ストア内の既存のディレクトリを参照しているかどうかを確認します。参照していない場合は、CreateDirectoryメソッドで、分離ストレージのスコープ内に、ディレクトリ(/shared/transfers)を作成します。ディレクトリ名は必ずこの名前である必要があります。
  Private Sub AddBackGroundTransfer_Loaded(sender As Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    Dim xmldoc As XElement = XElement.Load("absoluteUri.xml")
    Dim myImageInfo As New List(Of ImageInfo)
 
    For Each result In From c In xmldoc.Descendants("ImageName") Select c
      myImageInfo.Add(New ImageInfo With {.absoluteUri = result.Value})
    Next
    ListBox1.ItemsSource = myImageInfo
 
    Dim isolate As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication
    If isolate.DirectoryExists("/shared/transfers") = False Then
      isolate.CreateDirectory("/shared/transfers")
    End If
  End Sub

[追加]ボタンがクリックされた時の処理

ButtonのTagプロパティにバインドしておいた、ImageInfoクラスのabsoluteUriプロパティの値を取得して、変数myTransferFileNameに格納しておきます。絶対URIで指定した、変数myTransferFileNameで初期化された新しいURIのインスタンスmyTransferUriオブジェクトを生成します。
指定した要求のURI(myTransferUri) で初期化された BackgroundTransferRequest クラスの新しいインスタンスmyTransferRequestオブジェクトを生成します。myTransferRequestオブジェクトのMethodプロパティにGETと指定します。MethodプロパティはGET(規定値)とPOSTをサポートしています。
URIからパスを除いたファイル名だけを取得して、変数myDownloadFileに格納しておきます。
分離ストレージのshared/transfers/ディレクトリ内にあるmyDownloadFile変数の値で初期化された、新しいURIのインスタンス、myDownloadUriオブジェクトを生成します。
要求されたファイルをダウンロードした場所を取得する、DownLoadLocationプロパティに、myDownloadUriオブジェクトを指定します。
モジュール内で宣言しているStringBuilder型のFileName(後述)にAppendメソッドで、カンマで区切りながら、要求されたファイル名を追加していきます。FileNameに.wmvと.pngが同時に含まれていた場合は、警告メッセージを表示して処理を抜けます。
バックグラウンド転送要求の管理を可能にする、BackgroundTransferServiceクラスのAddメソッドで、バックグラウンドの転送要求をキューに追加します。この場合は、myTransferRequestオブジェクトを追加します。
  Private Sub AddFile_Click(sender As Object, e As EventArgs)
    Dim myTransferFileName As String = DirectCast(sender, Button).Tag.ToString
    Dim myTransferUri As Uri = New Uri(myTransferFileName, Absolute)
    Dim myTransferRequest As BackgroundTransferRequest = New BackgroundTransferRequest(myTransferUri)
    myTransferRequest.Method = "GET"
    Dim myDownloadFile As String = myTransferFileName.Substring(myTransferFileName.LastIndexOf("/") + 1)
    Dim myDownloadUri As Uri = New Uri("shared/transfers/" & myDownloadFile, UriKind.RelativeOrAbsolute)
    myTransferRequest.DownloadLocation = myDownloadUri
  
    FileName.Append(myDownloadFile).Append(",")
    If FileName.ToString.Contains(".wmv") And FileName.ToString.Contains(".png") Then
      MessageBox.Show("形式の異なるファイルが選択されました。リストボックス内のデータを全部消去してから選択しなおしてください。")
      Exit Sub
    End If
    Try
      BackgroundTransferService.Add(myTransferRequest)
    Catch ex As Exception
      MessageBox.Show(ex.Message)
      Exit Sub
    End Try
  End Sub
End Class

四国のSOHO。薬師寺国安(VBプログラマ)と、薬師寺聖(デザイナ、エンジニア)によるコラボレーション・ユニット。1997年6月、Dynamic HTMLとDirectAnimationの普及を目的として結成。共同開発やユニット名義での執筆活動を行う。XMLおよび.NETに関する著書や連載多数。最新刊は「Silverlight実践プログラミング」両名とも、Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。http://www.PROJECTKySS.NET/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています