Silverlight-分離ストレージ

3番目のファイルアクセスメカニズムは Isolated Storageログインしたユーザーに関連付けられたストレージを提供するメカニズム。APIは、Stream からのクラス .NET System.IO名前空間。したがって、これまで見てきた他のメカニズムと同様に、他のタイプを使用できます。System.IO ストリームを操作して、テキストデータまたはバイナリデータのいずれかを保存できるようにします。

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

  • このストレージメカニズムは Isolated Storage ストアがパーティション化されており、Silverlightアプリケーションが特定の部分にのみアクセスできるためです。

  • 古い保存データにはアクセスできません。まず、ストアはユーザーごとにパーティション化されます。Silverlightアプリケーションは、ログインしてアプリケーションを実行しているユーザーとは異なるユーザーのストアにアクセスできません。

  • これは、Webアプリケーションが使用する可能性のある識別メカニズムとは何の関係もありません。これは覚えておくべき重要なポイントです。コンピューターを共有する人の中には、別々のWindowsアカウントを気にせず、使用するWebサイトへのログインとログアウトだけに慣れている人もいるからです。

分離ストレージの使用

分離ストレージはSilverlightに固有のものではありません。APIはもともとWindows FormsWebから起動されたアプリケーションが、部分的な信頼シナリオでデータをローカルに保存できるようにします。実装は異なり、完全にアクセスする方法はありません.NET FrameworkのSilverlightからの分離ストレージ、またはその逆。

ただし、これを使用したことがある場合は、ここでの手順は非常によく知られています。

  • まず、ユーザー固有のストアを要求します。この場合、アプリケーション用のものを求めています。サイト上のすべてのXAPで共有されるサイトごとのストアが必要な場合は、GetUserStoreForSite 代わりに。

  • どちらのメソッドも IsolatedStorageFile オブジェクト。これはファイルではなくディレクトリを表すため、かなり役に立たない名前です。

  • ファイルにアクセスするには、 IsolatedStorageFile のために Stream

  • 私たちは使用します IsolatedStorageFileStream クラス、およびそのコンストラクターでは、 IsolatedStorageFile 引数としてのオブジェクト。

  • そのため、ストアに新しいファイルを作成しています。ディスク上のファイルの正確な場所は不明です。

  • 含まれているディレクトリには、ファイルの名前を推測できないようにするためにランダム化された要素があります。

  • これがないと、悪意のあるWebサイトがユーザーのコンピューターにファイルを配置し、ファイルURLを作成してそれを開き、ユーザーをだましてプログラムをローカルで実行するリンクをクリックさせる可能性があります。

  • これを防ぐためにWindowsに組み込まれている他のさまざまな保護手段がありますが、これは、他の機能が何らかの理由で無効化またはバイパスされた場合のもう1つの防御層です。

  • ファイルはユーザーのプロファイル内のどこかに保存されますが、それはあなたがそれについて知ることができる限りです。君のIsolatedStorageFileStream その本当の場所を報告しません。

アプリケーションが実行された回数を追跡する簡単な例を見てみましょう。以下にXAMLコードを示します。

<UserControl x:Class = "StoreRunCount.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"> 
      <TextBlock x:Name = "runCountText" FontSize = "20" /> 
   </Grid> 
	
</UserControl>

これがC#コードです Isolated storage 使用されています。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 

using System.IO.IsolatedStorage; 
using System.IO;

namespace StoreRunCount { 

   public partial class MainPage : UserControl {
	
      const string RunCountFileName = "RunCount.bin"; 
		
      public MainPage() { 
         InitializeComponent();  
         int runCount = 0;  
			
         using (var store = IsolatedStorageFile.GetUserStoreForApplication()) { 
			
            if (store.FileExists(RunCountFileName)) { 
               using (var stm = store.OpenFile(RunCountFileName, 
                  FileMode.Open, FileAccess.Read)) 
               using (var r = new BinaryReader(stm)) { 
                  runCount = r.ReadInt32(); 
               }  
            } 
			
            runCount += 1;  
            using (var stm = store.OpenFile(RunCountFileName, 
               FileMode.Create, FileAccess.Write)) 
					
            using (var w = new BinaryWriter(stm)) { 
               w.Write(runCount); 
            } 
         }  
			
         runCountText.Text = "You have run this application " + runCount.ToString() + " time(s)"; 
      } 
   }
}

上記のコードをコンパイルして実行すると、次のWebページが表示され、このアプリケーションを何回実行したかが示されます。

クォータを増やす

何らかの理由で初期量が不足している場合、アプリケーションはより多くのスペースを要求することがあります。リクエストが成功する保証はありません。Silverlightは、ユーザーにアプリケーションにさらに多くのスペースを与えてもよいかどうかを尋ねます。

ちなみに、次のようなユーザー入力に応じて、より多くのストレージを要求することのみが許可されています。 click。プラグインの読み込み時やタイマーハンドラーなど、別の機会に質問しようとすると、Silverlightはユーザーにプロンプ​​トを表示せずに自動的に要求を失敗させます。追加のクォータは、ユーザーが対話しているアプリケーションでのみ使用できます。

ザ・ IsolatedStorageFile オブジェクトは、クォータを管理するための3つのメンバーを提供します-

  • AvailableFreeSpace
  • IncreaseQuotaTo
  • Quota

AvailableFreeSpace

AvailableFreeSpaceプロパティは、クォータのどれだけが空いているかを示します。

オペレーティングシステムはディレクトリを表すためにディスク上のスペースを割り当てる必要があるため、空のサブディレクトリでもクォータの一部を消費することに注意してください。そのため、使用可能なスペースは、合計クォータからすべてのファイルの合計サイズを差し引いたものよりも少ない場合があります。

クォータを増やす

続行するのに十分なスペースがない場合は、 IncreaseQuotaTo 方法。

クォータ

ここでは、3番目のプロパティを使用しています。 Quota、現在のクォータサイズを検出し、新しく要求されたクォータを取得するために必要な量を追加します。

メソッドはどちらかを返します True または False要求したものが割り当てられているかどうかを示します。Silverlightは、要求したよりも多くのスペースを割り当てることを決定する場合があることに注意してください。

これは、を増やすための簡単な例です。 quota、ボタンがクリックされたとき。以下にXAMLコードを示します。

<UserControl x:Class = "ChangeQuota.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"> 
      <TextBlock x:Name = "infoText" FontSize = "20" TextWrapping = "Wrap" />  
      <Button x:Name = "increaseQuota" Content = "Increase" HorizontalAlignment = "Center" 
         FontSize = "20" 
         VerticalAlignment = "Center" Click = "increaseQuota_Click" /> 
   </Grid>
	
</UserControl>

これがの実装です click クォータが増加するイベント。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input;
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 

using System.IO.IsolatedStorage;
  
namespace ChangeQuota { 

   public partial class MainPage : UserControl { 
	
      public MainPage() { 
         InitializeComponent(); 
      } 
	  
      private void increaseQuota_Click(object sender, RoutedEventArgs e) { 
         using (IsolatedStorageFile isoStore = 
            IsolatedStorageFile.GetUserStoreForApplication()) { 
               long newQuota = isoStore.Quota + 10240; 
					
               if (isoStore.IncreaseQuotaTo(newQuota)) { 
                  infoText.Text = "Quota is " + isoStore.Quota + ", free space: " + 
                  isoStore.AvailableFreeSpace; 
               } else { 
                  infoText.Text = "Meanie!"; 
               } 
         } 
      } 
   } 
}

上記のコードをコンパイルして実行すると、次の出力が表示されます。

クリックすると Increase、プロンプトが表示されます。それは増加するように頼みますQuota すでにあるものよりも10KB大きくなります。

クリックすると Yes、次に、使用可能なクォータの量を出力します。

理解を深めるために、上記の例を実行することをお勧めします。