バックグラウンドによるファイル転送(後編)
2011年9月12日(月)

ソリューションエクスプローラー内の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
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。


