Silverlight-file-access
Silverlight-ファイルアクセス
この章では、Silverlightアプリケーションがエンドユーザーのコンピューター上のファイルにアクセスする方法について説明します。 Silverlightでファイルにアクセスするには、主に3つの方法があります。 選択は、ファイルを使用する必要がある理由と、信頼できるアプリケーションを作成しているかどうかによって異なります。
- 最も柔軟なオプションは、ファイルダイアログ*クラスを使用することです。 *Open および Save ファイルダイアログを使用すると、ユーザーが適切な権限を持っている限り、エンドユーザーが選択した任意のファイルにアクセスできます。 ユーザーの同意がこのアプローチの中心です。 ユーザーは、読み込むファイルを選択するか、保存するときに上書きするファイルを選択するか、場所とファイル名を選択する必要があります。
- 2番目のオプションは、 System.IO 名前空間でさまざまなクラスを使用することです。 Silverlightは、* FileStream、StreamWriter、FileInfo、Directory、、 *DirectoryInfo などのクラスを提供します。これらはすべて、ユーザーの関与を必要とせずにファイルを開いてアクセスするコードを作成できます。 開発者にとってはより便利かもしれませんが、もちろん、ほとんどのユーザーは、Webページの一部として古いコードをダウンロードしてファイル内を検索することを望みません。
- 3番目のオプションは Isolated Storage で、これについては後で説明します。
ファイルを開くおよび保存ダイアログ
SaveFileDialog
*SaveFileDialog* クラスは、ファイルを保存する場所を選択するための標準オペレーティングシステムが提供するユーザーインターフェイスを示します。
いくつかの重要な機能は-
- これを使用するには、 SaveFileDialog クラスのインスタンスを作成します。
- ShowDialog を呼び出すと、それが表示され、戻りコードは、ユーザーがファイルを保存する場所を選択したか、ダイアログをキャンセルしたかを示します。
- そこにある True との冗長な外観の比較について疑問に思うかもしれません。 ShowDialog が True 値を返す場合、ユーザーがファイルを選択したことを意味します。 したがって、 OpenFile メソッドを呼び出して、 Stream を返します。
- 必要に応じて、ユーザーが選択した名前を見つけることができます。 このダイアログには、 SafeFileName というプロパティがありますが、パスは含まれていません。 いずれにせよ、データを書き込む唯一の方法は、ダイアログによって返される Stream を使用することです。 開発者の観点から見ると、これは単なる* .NETストリーム*であるため、 StreamWriter にラップしてテキストを書き込むことができます。
OpenFileDialog
OpenFileDialogは、 SaveFileDialog と使用方法が似ています。 明らかに、常に新しいファイルではなく既存のファイルを選択していますが、別の重要な違いがあります。
- MultiSelect というプロパティがあります。 これを True に設定すると、ユーザーは複数のファイルを選択できます。 つまり、ダイアログにはもう少し複雑なAPIが必要です。
- SaveFileDialog は一度に1つのファイルのみを処理しますが、 OpenFileDialog はより多くのファイルを処理できるため、 OpenFile メソッドを提供しません。 コードを拡張する必要があります。 ダイアログが*単一ファイル*モードまたは MultiSelect モードのどちらであるかに応じて、 File または Files プロパティを使用します。
- ここで、以下の例では、シングルファイルモードです。 したがって、 File を使用し、返される FileInfo オブジェクトで OpenRead を呼び出します。
- multiselect モードでは、代わりに Files を使用し、 FileInfo オブジェクトのコレクションを返します。
FileStream
上記の*ファイルアクセス*への2番目のアプローチは、 FileStream クラス、または System.IO 名前空間の関連タイプを直接使用することです。 ほとんどの場合、完全な .NET Framework を使用したファイルアクセスに似ているため、これについて言うことはあまりありません。
ただし、Silverlight固有のいくつかの工夫があります。
まず、このアプローチでは、ユーザーの介入なしにいつでもファイルにアクセスできます。また、ファイルアクティビティの明らかな視覚的表示なしで、信頼できるアプリケーションのみがこの手法を使用できます。 信頼を高めるには、ブラウザを使い果たす必要があることを忘れないでください。 2番目の問題は、特定の特定のフォルダー内のファイルのみが使用可能であることです。 ユーザーのドキュメント、音楽、写真、またはビデオファイル*の下にあるファイルのみを読み書きできます。 その理由の1つは、Silverlightが複数のプラットフォームで実行され、たとえばApple Macのファイルシステム構造がWindowsのファイルシステム構造と非常に異なるためです。 そのため、クロスプラットフォームのファイルアクセスは、Silverlightがサポートするすべてのシステムで利用可能な限られたフォルダーのセットで機能する必要があります。
これらのフォルダーは異なるオペレーティングシステムの異なる場所にあり、それらの場所は通常ユーザーごとに異なるため、 Environment.GetFolderPath メソッドを使用して実行時に実際の場所を見つける必要があります。 開始点の下のディレクトリ構造を調べることができます。 System.IO 名前空間の *Directory および DirectoryInfo クラスを使用すると、ファイルとディレクトリを列挙できます。
*OpenFileDialog* でファイルを開き、 *SaveFileDialog* でテキストをファイルに保存できる簡単な例を考えてみましょう。
以下に示すのは、2つのボタンと*テキストボックス*が作成されるXAMLコードです。
<UserControl x:Class = "FileDialogs.MainPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d"
d:DesignHeight = "300" d:DesignWidth = "400">
<Grid x:Name = "LayoutRoot" Background = "White">
<Grid.RowDefinitions>
<RowDefinition Height = "Auto"/>
<RowDefinition Height = "265*"/>
</Grid.RowDefinitions>
<Button
x:Name = "saveFileButton"
Content = "Save"
Width = "75" FontSize = "20"
HorizontalAlignment = "Left" VerticalAlignment = "Top"
Margin = "12,12" Click = "saveFileButton_Click"/>
<Button
x:Name = "openFileButton"
Content = "Open"
Width = "75" FontSize = "20"
HorizontalAlignment = "Left" VerticalAlignment = "Top"
Margin = "101,12,0,0" Click = "openFileButton_Click"/>
<TextBox
x:Name = "contentTextBox"
Grid.Row = "1"
Margin = "12" FontSize = "20"/>
</Grid>
</UserControl>
以下に、ファイルを開いて保存するクリックイベント実装のC#コードを示します。
using System;
using System.Diagnostics;
using System.IO;
using System.Windows;
using System.Windows.Controls;
namespace FileDialogs {
public partial class MainPage : UserControl {
public MainPage() {
InitializeComponent();
}
private void saveFileButton_Click(object sender, RoutedEventArgs e) {
var save = new SaveFileDialog();
save.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*";
save.DefaultExt = ".txt";
if (save.ShowDialog() == true) {
Debug.WriteLine(save.SafeFileName);
using (Stream saveStream = save.OpenFile())
using (var w = new StreamWriter(saveStream)) {
var fs = saveStream as FileStream;
if (fs != null) {
w.Write(contentTextBox.Text);
}
}
}
}
private void openFileButton_Click(object sender, RoutedEventArgs e) {
var open = new OpenFileDialog();
if (open.ShowDialog() == true) {
using (Stream openStream = open.File.OpenRead()) {
using (var read = new StreamReader(openStream)) {
contentTextBox.Text = read.ReadToEnd();
}
}
}
}
}
}
上記のコードをコンパイルして実行すると、2つのボタンを含む次のWebページが表示されます。
*Open* ボタンをクリックして、 *OpenFileDialog* を開いてテキストファイルを選択します。
テキストファイルを選択して[開く]をクリックすると、テキストボックスにテキストが表示されます。
テキストをファイルに保存するには、テキストを更新します。
[保存]ボタンをクリックして、変更を新しいテキストファイルまたは既存のファイルに保存します。
既存のテキストファイルへの変更を保存するには、 SaveFileDialog でテキストファイルを選択しますが、新しいファイルへの変更を保存する場合は、ファイル名を書き、 Save ボタンをクリックします。