Silverlight-ファイルアクセス

この章では、Silverlightアプリケーションがエンドユーザーのコンピューター上のファイルにアクセスする方法を説明します。Silverlightでファイルにアクセスする主な方法は3つあります。選択は、ファイルを使用する必要がある理由、および信頼できるアプリケーションを作成しているかどうかによって異なります。

  • 最も柔軟なオプションは、 file dialogクラス。とともにOpen そして Saveファイルダイアログでは、ユーザーが適切な権限を持っている限り、エンドユーザーが選択した任意のファイルにアクセスできます。ユーザーの同意は、このアプローチの中心です。ユーザーは、読み取るファイルを選択する必要があります。または、保存するときに、上書きするファイルを選択するか、場所とファイル名を選択します。

  • 2番目のオプションは、のさまざまなクラスを使用することです。 System.IO名前空間。Silverlightは次のようなクラスを提供しますFileStream, StreamWriter, FileInfo, Directory, そして DirectoryInfo、これらすべてにより、ユーザーを関与させることなく、ファイルを開いてアクセスするコードを記述できます。これは開発者にとってより便利かもしれませんが、もちろん、ほとんどのユーザーは、Webページの一部としてダウンロードされた古いコードがファイル内を検索できるようにしたくないでしょう。

  • 3番目のオプションは Isolated Storage、これについては後で説明します。

ファイルダイアログを開いて保存する

SaveFileDialog

ザ・ SaveFileDialog classは、ファイルの保存場所を選択するための、オペレーティングシステムが提供する標準のユーザーインターフェイスを示しています。

いくつかの重要な機能は次のとおりです。

  • これを使用するには、のインスタンスを作成します SaveFileDialog クラス。

  • 呼び出し ShowDialog、が表示され、戻りコードは、ユーザーがファイルを保存する場所を選択したか、ダイアログをキャンセルしたかを示します。

  • あなたは冗長に見える比較について疑問に思うかもしれません Trueそこ。場合ShowDialog 戻り値 Truevalueは、ユーザーがファイルを選択したことを意味します。だから私たちは電話を続けることができますOpenFile メソッド、これは私たちに Stream

  • 必要に応じて、ユーザーが選択した名前を見つけることができます。ダイアログには、というプロパティがありますSafeFileName、ただし、パスは含まれていません。いずれにせよ、データを書き込む唯一の方法は、Streamダイアログによって返されます。開発者の観点からは、これはごく普通のことです.NET stream、それで私たちはそれを包むことができます StreamWriter、それにテキストを書き込むため。

OpenFileDialog

OpenFileDialogは、使用法が SaveFileDialog。明らかに、新しいファイルではなく既存のファイルを常に選択していますが、別の重要な違いがあります。

  • それはと呼ばれるプロパティを提供しています MultiSelect。これをに設定するとTrue、ユーザーは複数のファイルを選択できます。これは、ダイアログにもう少し複雑なAPIが必要であることを意味します。

  • ザ・ SaveFileDialog 一度に1つのファイルのみを処理しますが、 OpenFileDialog より多くに対処することができるので、それは提供していません OpenFile方法。コードを拡張する必要があります。ダイアログが表示されているかどうかによって異なりますsingle file モード、または MultiSelect モード、あなたはその File、または Files プロパティ。

  • ここで、以下の例では、単一ファイルモードになっています。したがって、File、そして私たちは OpenReadFileInfo 戻るオブジェクト。

  • multiselect モード、使用します Files 代わりに、のコレクションを返します FileInfo オブジェクト。

FileStream

への2番目のアプローチ file access 上記のように使用することです FileStream クラス、または関連するタイプ System.IO名前空間を直接。ほとんどの場合、完全なファイルアクセスに似ているため、これについて言うことはあまりありません。.NET Framework

ただし、Silverlight固有の工夫がいくつかあります。

  • まず、このアプローチでは、ユーザーの介入なしにいつでもファイルにアクセスでき、ファイルアクティビティの明らかな表示がなくても、信頼できるアプリケーションのみがこの手法を使用できます。信頼を高めるには、ブラウザを使い果たす必要があることを忘れないでください。

  • 2番目の問題は、特定のフォルダー内のファイルのみが使用可能であるということです。読み取りと書き込みができるのは、User's Documents, Music, Pictures, or Video files。この理由の1つは、Silverlightが複数のプラットフォームで実行され、たとえばAppleMacのファイルシステム構造がWindowsのファイルシステム構造と大きく異なることです。したがって、クロスプラットフォームのファイルアクセスは、Silverlightがサポートするすべてのシステムで使用できるフォルダーの限られたセットに関して機能する必要があります。

  • これらのフォルダは異なるオペレーティングシステムの異なる場所にあり、それらの場所は通常ユーザーごとに異なるため、を使用する必要があります。 Environment.GetFolderPath 実行時に実際の場所を検出する方法。

  • 開始点の下のディレクトリ構造を調べることができます。ザ・Directory そして DirectoryInfo のクラス System.IO 名前空間を使用すると、ファイルとディレクトリを列挙できます。

ファイルを経由して開くことができる簡単な例を考えてみましょう OpenFileDialog を介してファイルにテキストを保存します SaveFileDialog

以下に示すのは、2つのボタンと1つのXAMLコードです。 text box 作成されます。

<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 テキストファイルを選択します。

テキストファイルを選択してクリック Open、テキストボックスにテキストが表示されます。

テキストをファイルに保存するには、テキストを更新します。

クリック Save ボタンをクリックして、変更を新しいテキストファイルまたは既存のファイルに保存します。

既存のテキストファイルへの変更を保存するには、でテキストファイルを選択します SaveFileDialog、ただし、新しいファイルへの変更を保存する場合は、ファイル名を入力して、 Save ボタン。