Silverlight-isolated-storage
Silverlight-分離ストレージ
3番目のファイルアクセスメカニズムは Isolated Storage メカニズムで、ログインしたユーザーに関連付けられたストレージを提供します。 APIは、。NET System.IO *名前空間の *Stream クラスを通じてデータを提示します。 したがって、これまで見てきた他のメカニズムと同様に、 System.IO の他のタイプを使用してストリームを操作し、テキストデータまたはバイナリデータを格納できます。
いくつかの重要な機能は-
- ストアはパーティション化され、Silverlightアプリケーションは特定の部分にのみアクセスできるため、このストレージメカニズムは Isolated Storage と呼ばれます。
- 古い保存データにはアクセスできません。 まず、ストアはユーザーごとにパーティション分割されます。 Silverlightアプリケーションは、ログインしてアプリケーションを実行しているユーザーとは異なるユーザーのストアにアクセスできません。
- これは、Webアプリケーションが使用する識別メカニズムとは関係ありません。 コンピューターを共有する一部のユーザーは、個別のWindowsアカウントに煩わされず、使用するWebサイトへのログインとログアウトだけに慣れているため、これは覚えておくべき重要なポイントです。
分離ストレージの使用
分離ストレージは、Silverlightに固有のものではありません。 APIはもともと Windows Forms 用に導入され、Webから起動されたアプリケーションが部分信頼シナリオでデータをローカルに保存できるようにしました。 実装は異なり、Silverlightから完全な .NET Frameworkの分離ストレージにアクセスする方法はありません。
ただし、使用している場合、ここでの手順は非常に馴染みがあります。
- ユーザー固有のストアを要求することから始めます。 この場合、アプリケーション用のものを要求しています。 サイト上のすべてのXAPでサイトごとのストアを共有する場合は、代わりに GetUserStoreForSite を呼び出します。
- どちらのメソッドも IsolatedStorageFile オブジェクトを返します。これは、ファイルではなくディレクトリを表すため、非常に役に立たない名前です。
- ファイルにアクセスするには、 IsolatedStorageFile に Stream を要求する必要があります。
- IsolatedStorageFileStream クラスを使用します。そのコンストラクターでは、引数として IsolatedStorageFile オブジェクトを渡す必要があります。
- そのため、ストアに新しいファイルを作成しています。 ディスク上のファイルの正確な場所は不明です。
- 含まれるディレクトリには、ファイルの名前を推測できないようにするために、要素がランダム化されています。
- これがないと、悪意のあるWebサイトがユーザーのコンピューターにファイルを配置し、ファイルのURLを作成してそれを開く可能性があります。ユーザーをだましてプログラムをローカルで実行するリンクをクリックさせます。
- これを防ぐためにWindowsに組み込まれている他のさまざまな保護手段がありますが、これは他の手段が何らかの方法で無効化またはバイパスされた場合の別の防御層です。 ファイルはユーザーのプロファイル内のどこかに保存されますが、それはあなたがそれについて知っている限りのことです。 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#コードです。
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
- 増加するクォータ
- クォータ
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大きくするように要求します。
[はい]をクリックすると、使用可能なクォータの量が出力されます。
理解を深めるために、上記の例を実行することをお勧めします。