ローカル・ディスク上でのファイル操作

2010年6月16日(水)
PROJECT KySS

任意のフォルダにアクセスし、ファイルの書き込み読み込みを実行する

今度は、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の連携方法を紹介します。

四国の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メルマガ会員のサービス内容を見る

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