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

2010年6月16日(水)
PROJECT KySS

MyDocumentsフォルダ内を操作する処理を記述する

レイアウトとTrustedモードの設定ができたら、リスト1のようなロジック・コードを記述していきます。

リスト1: MyDocumentsフォルダ内を操作するロジック・コード(MainPage.xaml.vb)

■名前空間の読み込み
ファイルの入出力に関するクラスの含まれるSystem.IO名前空間をインポートします。
Option Strict On
Imports System.IO

■[MyDocumentsフォルダ内のファイル取得]ボタンをクリックしたときの処理
IsRunningOutOfBrowserプロパティでアプリケーションがブラウザ外で実行されているかどうかをチェックし、HasElevatedPermissionsプロパティで、アプリケーションが高い信頼性のあるブラウザ外で動作しているかをチェックします。
ブラウザ外で実行されず、高い信頼性に基づいていない場合は、メッセージボックスを表示します。
ブラウザ外で実行され、高い信頼性に基づいている場合は、以下の処理を実行します。

まず、ファイルを取得するためのリスト・コレクションを作成します。GetFolderPathメソッドでシステムの固定フォルダ(このサンプルでは、MyDocumentsフォルダ)へのパスを取得します。
Environment.SpecialFolder列挙体のメンバには、MyMusic、MyPictures、System、ProgramFiles、MyComputer等があります。ファイル・システムへの書き込みが可能であるのは、その中で「My」のついたフォルダのみです。MyDocumentsフォルダ内を反復処理しながら、Addメソッドでリスト・コレクションにファイルを追加していきます。ListBox1コントロールのItemsSourceプロパティに、ファイルの追加された、myDocumentFolderオブジェクトを指定します。ListBoxコントロール内にMyDocumentフォルダ内のファイルが、絶対パス付きで一覧表示されます。
さらに、Try~Catch~End Tryで例外処理を追加しておきます。これは、「Debug」ペインのStartActionを「Dynamically generate a test page」ではなく「Out-of-browser-application」に設定している場合、ファイル保存後に[My Documentフォルダ内のファイル取得]ボタンをクリックすると発生するエラーを回避するためです。
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    Try
      If App.Current.IsRunningOutOfBrowser = False AndAlso App.Current.HasElevatedPermissions = False Then
        MessageBox.Show("Trustedモードによるブラウザ外実行を行ってください。")
        Exit Sub
      Else
        Dim myDocumentFolder As New List(Of String)
        Dim myDocument = Directory.EnumerateFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))
        For Each myFiles In myDocument
          myDocumentFolder.Add(myFiles)
        Next
        ListBox1.ItemsSource = myDocumentFolder
      End If
    Catch
      Exit Sub
    End Try
  End Sub

■[MyDocumentsフォルダ内に書き込み]ボタンをクリックしたときの処理
IsRunningOutOfBrowserプロパティでアプリケーションがブラウザ外で実行されているかどうかをチェックし、HasElevatedPermissionsプロパティで、アプリケーションが高い信頼性のあるブラウザ外で動作しているかをチェックします。ブラウザ外で実行されず、高い信頼性に基づいていない場合は、メッセージ・ボックスを表示します。ブラウザ外で実行され、高い信頼性に基づいている場合は、以下の処理を実行します。

ファイル名を入力するTextBoxコントロール(名前はfileNameTextBox)内に、ファイル名が入力されている場合の処理です。
Path.CombineメソッドでMyDocumentsフォルダのパスと、fileNameTextBox内に入力されたファイル名を連結し、変数filePathに格納します。同じファイル名のファイルが存在した場合は、Deleteメソッドで削除します。ファイル名と文字コードで初期化された新しいStreamWriterのインスタンスである、writerオブジェクトを生成します。文字コードを指定する際には、Shift_JISではなく、Unicode形式でなければ書き込めませんので注意してください。ここではutf-8を指定しています。Writeメソッドで、TextBoxコントロール(名前はTextBox1)内に入力された内容をストリームに書き込みます。StreamWriterを閉じます。
  Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button2.Click
    If App.Current.IsRunningOutOfBrowser = False AndAlso App.Current.HasElevatedPermissions = False Then
      MessageBox.Show("Trustedモードによるブラウザ外実行を行ってください。")
      Exit Sub
    Else
      If fileNameTextBox.Text String.Empty Then
        Dim filePath As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), fileNameTextBox.Text)
        If File.Exists(filePath) = True Then
          File.Delete(filePath)
        End If
        Dim writer As StreamWriter = New StreamWriter(filePath, False, System.Text.Encoding.GetEncoding("utf-8"))
        writer.Write(TextBox1.Text)
        writer.Close()
        MessageBox.Show(fileNameTextBox.Text & "を保存しました。" & vbCrLf & _
          "[MyDocumentsフォルダ内のファイル取得]ボタンをクリックしてファイルの確認をしてください。")
      Else
        MessageBox.Show("書き出すファイル名を入力してください。")
      End If
    End If
  End Sub

■ListBoxコントロール内に表示されているファイル名が選択されたときの処理
ListBoxコントロールより選択されたパス付きファイル名を、変数filePathに格納します。選択されたファイル名と文字コードで初期化された、新しいStreamReaderのインスタンスである、readerオブジェクトを生成します。ReadToEndメソッドでファイルの内容を読み取ります。読み取った内容をTextBoxコントロール(名前はTextBox2)に表示します。StreamReaderを閉じます。StreamReaderクラスは、標準テキスト・ファイルから情報の行を読み込みます。つまり、読み込み可能なファイルは、テキスト形式のファイルに限られます。WordドキュメントやExcelブックやPDFファイル等を読み込んで表示することはできません。
  Private Sub ListBox1_SelectionChanged(ByVal sender As Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles ListBox1.SelectionChanged
    Dim filePath As String = ListBox1.SelectedItem.ToString
    Dim reader As StreamReader = New StreamReader(filePath, System.Text.Encoding.GetEncoding("utf-8"))
    Dim myContents As String = reader.ReadToEnd
    TextBox2.Text = myContents
    reader.Close()
  End Sub

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

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