指定したフォルダのファイル一覧と特殊フォルダへのアクセス

2010年8月5日(木)
PROJECT KySS

ComboBoxに表示された特殊フォルダへのアクセス

次に紹介するのは、特殊フォルダへのアクセスと書き込みのサンプルです。書き込みが可能なのは、MyDocuments、MyPictures、MyMusic、MyVideos等で、「My」の付いたフォルダに限られます。これらSpecialFolder(特殊フォルダ)についてはMicrosoft社のWebサイトを参照してください。このサンプルは信頼されたTrustedモードのブラウザ外実行で動作します。

実装する機能の動作は次の通りです。

ComboBoxに表示されているMyDocuments、MyVideos 、MyMusic、MyPicturesフォルダを選択すると、そのフォルダ内にあるファイルの一覧がListBoxコントロールに表示されます(図11)。表示されたファイルを選択すると、その内容が子ウィンドウに表示されます(図12)。

また、TextBoxコントロール内に文字列を入力し、任意のファイル名を付けた文書を、ComboBoxより選択したフォルダに保存することができます(図13)。

ここで再度ComboBox内からファイルを保存したフォルダを選択すると、作成して保存したファイルを含む既存ファイルの一覧が表示されます(図14)。

サンプル・ファイルはこちらからダウンロードできます。

図11: MyVideosフォルダ内のファイル一覧が表示されている(クリックで拡大)

図12: 選択されたファイルの内容が子ウィンドウに表示されている(クリックで拡大)

図13: テキストを入力し、ファイル名を入力して、MyVideosフォルダ内に保存した(クリックで拡大)

図14: MyVideosフォルダにファイルが保存されている(クリックで拡大)

コントロールのレイアウトと、Trustedモードの設定

これまでのサンプル作成時と同様の手順で、新規Silverlight 4プロジェクト(プロジェクト名は「SL4_SpecialFolderAccess」)を作成してください。プロジェクトの依存関係も設定してください。

UserControlのプロパティ内の[レイアウト]を展開して、Widthに800、Heightに600を指定します。ツールボックスから、TextBlock、ComboBox、ListBox、Label、TextBox、Buttonコントロールをレイアウトします。

ButtonコントロールのContentプロパティには、ボタン表面に表示する文字を指定します。このButtonコントロールはデフォルトでは使用不可としておきます。[共通]プロパティの、IsEnabledのチェックを外しておきます。TextBox2のプロパティから、[その他]を展開して表示されるAcceptsReturnプロパティにチェックを付けて、改行を許可して表示するようにします。また、[テキスト]を展開して表示されるTextWrappingプロパティには「Wrap」を、[その他]を展開して表示される、VerticalScrollBarVisibilityプロパティには「Auto」を指定しておきます。

ComboBoxコントロールの、[共通]プロパティ内のItemsの横にある[…]ボタンをクリックし、「コレクションエディター」を起動します。[Add]ボタンでComboBoxItemを5つ追加します。右に表示されるプロパティのContentに、上から順に「フォルダーを選択」「MyDocuments」「MyVideos」「MyMusic」「MyPictures」と指定します。一番上の「フォルダーを選択」と指定したComboBoxItemの、[共通]プロパティ内のIsSelectedにチェックを付け、デフォルトでこの項目が選択されるようにします(図15)。[OK]ボタンをクリックします。図16のようになります。

図15: ComboBoxの「コレクションエディター」から項目を設定する(クリックで拡大)

図16: TextBlock、ComboBox、ListBox、Label、TextBox、Buttonをレイアウトする

このサンプルは信頼されたTrustedモードのブラウザ外実行で動作させます。Trustedモードのブラウザ外実行については、前掲のサンプルを参照してください。

子ウインドウ(ChildWindow)の設定

任意のファイルを選択して、内容を表示する子ウインドウ(ChildWindow)の設定を行います。VS2010メニューの「プロジェクト(P)> 新しい項目の追加(W)」と選択し、表示される画面から、「Silverlight 子ウィンドウ」を選択します。「名前(N)」はデフォルトのChildWindow1.xamlのままにしておきます(図17)。

図17: Silverlight子ウィンドウを選択する(クリックで拡大)

作成されるChildWindow1.xamlには[OK]と[キャンセル]ボタンがあらかじめ用意されています。[キャンセル]ボタンは不要なので削除して、[OK]ボタンのみ残しておきます。

UserControlのプロパティペインの[レイアウト]を展開して、Widthに430、Heightに390を指定します。次に2行のGridをリスト1のように記述して作成し、1行目にTextBlock、2行目にすでにレイアウトされていた[OK]ボタンを配置します(図18)。

リスト1: 2行のGridを作成するXAMLコード(ChildWindow1.xaml)

図18: 1行目にTextBlock、2行目にButtonコントロールをレイアウトする

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

リスト2のようにロジックコードを記述します。

リスト2: ロジックコード(MainPage.xaml.vb)

ファイルの入出力に関するクラスの含まれる、System.IO名前空間をインポートします。

Object型のmyGetFolderPathメンバ変数を宣言します。この変数には、システムの特別なフォルダへのディレクトリ パスとComboBoxから選択されたフォルダ名とが連結されて格納されます。

■ComboBoxコントロールの項目が選択された時に発生するイベント

アプリケーションがブラウザ外で実行されているかどうかをチェックし、同時に、HasElevatedPermissionsプロパティで、実行するアプリケーションが高い信頼性に基づいたブラウザ外で実行されているかを判定し、ブラウザ外で実行されていない場合(Falseの場合)と高い信頼性に基づいていない場合(Falseの場合)は、「TrustedモードのOut-Of-Browserで実行してください。」というメッセージを表示します。それ以外の場合は、以下の処理を実行します。

ComboBoxコントロールより選択されたインデックスが1より大きい場合の処理です。インデックスが0の場合は、「フォルダーを選択」という項目が選択されたことになります。

selectFolderにComboBoxコントロールより選択された項目名を格納します。選択された項目名が、「MyDocuments」であった場合は、Environment.SpecialFolder列挙体を使って、システムの特別なフォルダ名を変数myGetFolderPathに格納します。「MyVideos」、「MyMusic」、「MyPictures」に関しても同様です。

GetFolderPathメソッドでシステムの固定フォルダ(このサンプルでは、変数myGetFolderPathに格納されているフォルダ)へのパスを取得し、String型の反復処理を実装する変数myGetFolderで参照します。

ListBox1コントロールのItemsSourceプロパティに、myGetFolderオブジェクトを指定します。ListBoxコントロール内にmyGetFolderで参照され取得されたファイルの一覧が、絶対パス付きで一覧表示されます。

■[保存]ボタンをクリックしたときの処理

アプリケーションがブラウザ外で実行されているかどうかをチェックし、同時に、HasElevatedPermissionsプロパティで、実行するアプリケーションが高い信頼性に基づいたブラウザ外で実行されているかを判定し、ブラウザ外で実行されていない場合(Falseの場合)と高い信頼性に基づいていない場合(Falseの場合)は、「TrustedモードのOut-Of-Browserで実行してください。」というメッセージを表示します。それ以外の場合は、以下の処理を実行します。

ファイル名を入力するTextBoxコントロール(名前はTextBox1)内に、ファイル名が入力されている場合の処理です。

Path.CombineメソッドでComboBoxより選択された特殊フォルダのパスと、TextBox1内に入力されたファイル名を連結し、変数filePathに格納します。同じファイル名のファイルが存在した場合は、Deleteメソッドで削除します。ファイル名と文字コードで初期化された新しいStreamWriterのインスタンスである、writerオブジェクトを生成します。文字コードを指定する際には、Shift_JISではなく、Unicode形式でなければ書き込めませんので注意してください。ここではutf-8を指定しています。Writeメソッドで、TextBoxコントロール(名前はTextBox2)内に入力された内容をストリームに書き込みます。StreamWriterを閉じます。ComboBoxコントロールのSelectedIndexに0を指定し、「フォルダーを選択」を表示させます。

■ListBoxコントロール内に表示されているファイル名が選択されたときの処理

ListBoxコントロールより選択された絶対パス付ファイル名を変数filePathに格納します。ファイル名と文字コードで初期化された新しいStreamReaderのインスタンスである、readerオブジェクトを生成します。ReadToEndメソッドでファイルの内容を読み取り、変数myContentsに格納します。StreamReaderオブジェクトを閉じます。

新しいChildWindow1のインスタンスmyChildWindowを生成します。myChildWindowオブジェクト内のTextBlock1コントロールにmyContentsの内容を表示します。ChildWindowが開いたときに、ビジュアル・ブラシを設定するOverlayBrushにYellowを指定し、親ウインドウを覆うOverlayOpacityに0.5を指定します。これで、子ウインドウが開いたとき、親ウインドウは透過度が50%のYellowで覆われます。TitleプロパティにはfilePath変数に格納されている絶対パス付きのファイル名を指定します。Showメソッドで子ウインドウを開きます。

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

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