ローカル・ディスク上でのファイル操作
任意のフォルダにアクセスし、ファイルの書き込み読み込みを実行する
今度は、Silverlight 4で追加された、COMオートメーションを使って、任意のフォルダにアクセスしてファイルを処理するサンプルを作成してみましょう。
プロジェクト・ファイルは、こちらからダウンロードできます。
このサンプルでは、C:\SL4_Dataフォルダに入力内容を保存します(図5)。そのため、サンプルを実行する前に、必ずC:\SL4_Dataというフォルダを作成してください。また、保存した内容を読み込んで表示します(図6)。
図5: ブラウザ外実行で、C:\SL4_Dataフォルダに、ToDo_20100501.txtを保存した |
図6: [C:\SL4_Dataからの読み込み]ボタンで「ファイル名」に指定されたファイルを読み込んでいる |
では、サンプルを作成していきましょう。「SL4_FileSystem」という名前の、新規「Silverlight Application」を作成し、依存関係を設定しておきます。
次に、UserControlのPropertiesペインの[Layout]を展開して、Widthに600、Heightに500を指定します。
ToolboxからButton、TextBoxコントロールを、図7のようにレイアウトしてください。
図7: Button、TextBoxコントロールをレイアウトする |
ButtonコントロールのContentプロパティには、ボタン表面に表示する文字を指定します。
saveContentTextBoxとreadContentTextBoxコントロールのAcceptsReturnプロパティには、チェックを付けて、改行を可能にしておきます。また、TextWrappingプロパティには「Wrap」を、VerticalScrollBarVisibilityプロパティには「Auto」を指定しておきます。
このサンプルは信頼されたTrustedモードのブラウザ外実行で動作させます。これらの設定の詳しい手順および、デバッグの手順については、第3回の記事を参照してください。以上の操作で書き出されるXAMLコードは省略します。
ファイル・アクセスの処理を記述する
レイアウトとブラウザ外実行の設定ができたら、リスト2のようにロジック・コードを記述します。
リスト2: 任意のフォルダ内のファイルを操作するロジック・コード(MainPage.xaml.vb)
■名前空間の読み込み
COMオートメーションを扱うクラスの含まれるSystem.Runtime.InteropServices.Automation名前空間をインポートします。
Imports System.Runtime.InteropServices.Automation
■[C:\SL4_Dataに保存]ボタンをクリックしたときの処理
AutomationFactoryクラスのIsAvailableプロパティで、Silverlightにおけるオートメーション機能が、アプリケーションで利用可能かどうかをチェックします。同時に、HasElevatedPermissionsプロパティで、実行するアプリケーションが高い信頼性に基づいたブラウザ外で実行されているかどうかについても判定をして、利用可能で(Trueの場合)高い信頼性に基づいている場合(Trueの場合)は、以下の処理を実行します。利用不可の場合は、「Trustedモードによるブラウザ外実行を行ってください。」というメッセージを表示します。
登録されたオートメーション・サーバへのアクセスを行うAutomationFactoryクラスのCreateObjectメソッドで、ProgID(Scripting.FileSystemObject)に指定されたアプリケーションにアクセスします。
CreateTextFileメソッドでfileNameTextBoxに指定された名前のファイルを作成し、書き込みが出来るようにします。WriteLineメソッドでTextBox(名前はsaveContentTextBox)内のデータを書き込みます。ファイルを閉じて、保存した旨のメッセージを表示します。
ここで使っているCreateTextFileの書式は下記のとおりです。
CreateTextFile(作成するファイルの名前,既存のファイルに上書きするかどうか[上書きの場合はTrue、しない場合はFalse(規定値)],文字コードの指定[Unicodeの場合はTrue、ASCIIの場合はFalse(規定値)])
上書きと文字コードは省略可能です。このサンプルでは、上書きとUnicodeを指定しています。
Private Sub writeButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles writeButton.Click
If AutomationFactory.IsAvailable = True AndAlso Application.Current.HasElevatedPermissions = True Then
If fileNameTextBox.Text String.Empty Then
Dim writeCom As Object = AutomationFactory.CreateObject("Scripting.FileSystemObject")
Dim writeFile As Object = writeCom.CreateTextFile("C:\SL4_Data\" & fileNameTextBox.Text, True, True)
writeFile.WriteLine(saveContentTextBox.Text)
writeFile.Close()
MessageBox.Show(fileNameTextBox.Text & "を保存しました。")
Else
MessageBox.Show("保存するファイル名を入力してください。")
Exit Sub
End If
Else
MessageBox.Show("Trustedモードによるブラウザ外実行を行ってください。")
Exit Sub
End If
End Sub
■[C:\SL4_Dataからの読み込み]ボタンがクリックされたときの処理
AutomationFactoryクラスのIsAvailableプロパティで、Silverlightにおけるオートメーション機能が、アプリケーションで利用可能かどうかをチェックします。同時に、HasElevatedPermissionsプロパティで、実行するアプリケーションが高い信頼性に基づいたブラウザ外で実行されているかどうかを判定し、利用可能で(Trueの場合)高い信頼性に基づいている場合(Trueの場合)は、以下の処理を実行し、利用不可の場合は、「Trustedモードによるブラウザ外実行を行ってください。」というメッセージを表示します。
登録されたオートメーション・サーバへのアクセスを行うAutomationFactoryクラスのCreateObjectメソッドで、ProgID(Scripting.FileSystemObject)に指定されたアプリケーションにアクセスします。
ファイル名が指定されており、そのファイルが存在する場合は(FileExists)、OpenTextFileメソッドでfileNameTextBox内に指定されたファイルを、読み込み専用として開きます。OpenTextFileメソッドの第二引数に1を指定した場合は「読み込み専用」、2を指定すると「書き込み専用」、8を指定すると「ファイルの最後に追加して書き込み」になります。
ここで使っているOpenTextFileの書式は下記のとおりです。
OpenTextFile(開くファイルの名前,iomode[読み込み専用の場合は1、書き込み専用の場合は2、ファイルの最後に追加する場合は8],ファイルが存在しなかった場合に作成するかどうか[作成する場合はTrue、作成しない場合はFalse(規定値)],format[Unicodeとして開く場合はTrue、ASCIIとして開く場合はFalse(規定値)、システムデフォルトで開く場合はDefault])
iomodeとファイルの存在、formatは省略可能です。このサンプルでは、読み込み専用、ファイルは作成しない、文字コードはUnicodeとして開いています。
TextBox(名前はreadContentTextBox)内にReadAllメソッドでファイル全体を読み込み、その内容を表示します。ファイルを閉じます。
ファイル名が指定されていなかったり、指定されたファイルが存在しない場合は、メッセージを表示して処理を終えます。
ここで使用している、FileExists、CreateTextFile、OpenTextFile、ReadAllメソッド等は、.NETのクラスに属するメソッドではありません。FileSystemObjectのメソッドです。よってインテリセンス機能では、これらのメソッドは表示されません。
Private Sub readButton_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles readButton.Click
If AutomationFactory.IsAvailable = True AndAlso Application.Current.HasElevatedPermissions = True Then
Dim readCom As Object = AutomationFactory.CreateObject("Scripting.FileSystemObject")
If fileNameTextBox.Text String.Empty AndAlso readCom.FileExists("C:\SL4_Data\" & fileNameTextBox.Text) = True Then
Dim readFile As Object = readCom.OpenTextFile("C:\SL4_Data\" & fileNameTextBox.Text, 1, , True)
readContentTextBox.Text = readFile.ReadAll
readFile.Close()
Else
MessageBox.Show("ファイル名を指定されていないかファイルが存在しません。")
Exit Sub
End If
Else
MessageBox.Show("Trustedモードによるブラウザ外実行を行ってください。")
Exit Sub
End If
End Sub
次回は、Office 2010とSilverlight 4の連携方法を紹介します。