Silverlight 2の独立したメモリ(Isolated Strage)を詳細に説明する.

16120 ワード

著作権声明:オリジナル作品は、転載を許可します.転載する時は必ずハイパーリンクで文章を表記してください.
元の出典、著者情報と本声明.さもなくば法律責任を追及します.
http://terrylee.blog.51cto.com/342737/84585
概要
独立したストレージ(Isolated Strage)は、Silverlight 2に提供されるクライアントの安全な記憶であり、Cookie機構と類似したローカル信頼機構である.独立した記憶メカニズムのAPIは、仮想ファイルシステムとこの仮想ファイルシステムにアクセスできるデータストリームオブジェクトを提供する.Silverlightにおける独立したメモリは.NET Framewarkにおける独立したストレージに基づいて構築されているので,NET Frame ebookに独立して格納されているサブセットにすぎない.
Silverlightにおける個別記憶には、以下のような特徴がある.
1.Silverlightベースのアプリケーションはそれぞれ自分の一部の記憶空間に割り当てられていますが、アプリケーションのプログラムセットは記憶空間で共有されています.一つのアプリケーションはサーバによって一意の固定された識別値を与えられました.Silverlightに基づくアプリケーションの仮想ファイルシステムは、現在、識別値としてアクセスされています.この識別値は常に必要です.この共有の位置はアプリケーションが実行されるたびに見つけられます.  
2.独立して保存されたAPIは、実際には他のファイルと同様に、FileやDirectoryなどのAPIを操作して、ファイルやフォルダにアクセスして維持するためのクラスです.これらはFileStream APIに基づいてファイルの内容を維持しています.
3.独立して保存することは、アプリケーションが格納できるデータのサイズを制限しています.現在の上限は、各アプリケーションが1 MBです.
独立したメモリを使う
Silverlight内の独立した記憶機能は、気密タイプIsolated StrageFileによって提供され、名前空間System.IO.Isolitaed Storragの中にあり、IsolageFile類は独立して格納された仮想ファイルシステムを抽象化している.ファイルまたはフォルダを列挙または管理するために使用することができます.また、このクラスのIII−StrageFileStreamオブジェクトを使用してファイル内容を管理することもでき、その定義は以下の通りである.
Silverlight 2では、アプリケーションによって格納されるか、またはサイトによって格納されるかの2つの方式の独立した記憶がサポートされており、それぞれGetUserStreForApple方法とGetUserStreForSite方法を使用して、IsolageFileオブジェクトを取得することができる.簡単な例を見ます.最終的な効果は下図のようになります.
 
各機能の実現を見てみます.
ディレクトリを作成して、直接CreateDirectory方法を使えばいいです.また、ディレクトリーExistes方法を使ってディレクトリが既に存在しているかどうかを判断することもできます.
void btnCreateDirectory_Click(object sender, RoutedEventArgs e)

            {

            using (IsolatedStorageFile store =

            IsolatedStorageFile.GetUserStoreForApplication())

            {

            String directoryName = this.txtDirectoryName.Text;

            if (this.lstDirectories.SelectedItem != null)

            {

            directoryName = System.IO.Path.Combine(this.lstDirectories.SelectedItem.ToString(),

            directoryName);

            }

            if (!store.DirectoryExists(directoryName))

            {

            store.CreateDirectory(directoryName);

            HtmlPage.Window.Alert("      !");

            }

            }

            }
ファイルを作成し、CreateFile方法によりIsolated Streamを取得し、内容をファイルに書き込みます.
void btnCreateFile_Click(object sender, RoutedEventArgs e)

            {

            if (this.lstDirectories.SelectedItem == null &&

            this.txtDirectoryName.Text == "")

            {

            HtmlPage.Window.Alert("               ");

            return;

            }

            using (IsolatedStorageFile store =

            IsolatedStorageFile.GetUserStoreForApplication())

            {

            String filePath;

            if (this.lstDirectories.SelectedItem == null)

            {

            filePath = System.IO.Path.Combine(this.txtDirectoryName.Text,

            this.txtFileName.Text + ".txt");

            }

            else

            {

            filePath = System.IO.Path.Combine(this.lstDirectories.SelectedItem.ToString(),

            this.txtFileName.Text + ".txt");

            }

            IsolatedStorageFileStream fileStream = store.CreateFile(filePath);

            using (StreamWriter sw = new StreamWriter(fileStream))

            {

            sw.WriteLine(this.txtFileContent.Text);

            }

            fileStream.Close();

            HtmlPage.Window.Alert("      !");

            }

            }
ファイルを読み込み、直接にSystem.IO名前空間のStreamReaderを使用します.
void btnReadFile_Click(object sender, RoutedEventArgs e)

            {

            if (this.lstDirectories.SelectedItem == null ||

            this.lstFiles.SelectedItem == null)

            {

            HtmlPage.Window.Alert("         !");

            return;

            }

            using (IsolatedStorageFile store =

            IsolatedStorageFile.GetUserStoreForApplication())

            {

            String filePath = System.IO.Path.Combine(this.lstDirectories.SelectedItem.ToString(),

            this.lstFiles.SelectedItem.ToString());

            if (store.FileExists(filePath))

            {

            StreamReader reader = new StreamReader(store.OpenFile(filePath,

            FileMode.Open, FileAccess.Read));

            this.txtFileContent.Text = reader.ReadToEnd();

            this.txtDirectoryName.Text = this.lstDirectories.SelectedItem.ToString();

            this.txtFileName.Text = this.lstFiles.SelectedItem.ToString();

            }

            }

            }
ディレクトリとファイルを削除:
void btnDeleteFile_Click(object sender, RoutedEventArgs e)

            {

            if (this.lstDirectories.SelectedItem != null &&

            this.lstFiles.SelectedItem != null)

            {

            using (IsolatedStorageFile store =

            IsolatedStorageFile.GetUserStoreForApplication())

            {

            String filePath = System.IO.Path.Combine(this.lstDirectories.SelectedItem.ToString(),

            this.lstFiles.SelectedItem.ToString());

            store.DeleteFile(filePath);

            HtmlPage.Window.Alert("      !");

            }

            }

            }

            void btnDeleteDirectory_Click(object sender, RoutedEventArgs e)

            {

            if (this.lstDirectories.SelectedItem != null)

            {

            using (IsolatedStorageFile store =

            IsolatedStorageFile.GetUserStoreForApplication())

            {

            store.DeleteDirectory(this.lstDirectories.SelectedItem.ToString());

            HtmlPage.Window.Alert("      !");

            }

            }

            }
ディレクトリリストとファイルリストを取得:
void lstDirectories_SelectionChanged(object sender, SelectionChangedEventArgs e)

            {

            if (lstDirectories.SelectedItem != null)

            {

            using (IsolatedStorageFile store =

            IsolatedStorageFile.GetUserStoreForApplication())

            {

            String[] files = store.GetFileNames(

            this.lstDirectories.SelectedItem.ToString() + "/");

            this.lstFiles.ItemsSource = files;

            }

            }

            }

            void BindDirectories()

            {

            using (IsolatedStorageFile store =

            IsolatedStorageFile.GetUserStoreForApplication())

            {

            String[] directories = store.GetDirectoryNames("*");

            this.lstDirectories.ItemsSource = directories;

            }

            }
クォータを増やす
本論文では最初から独立した記憶方法で、アプリケーションが格納できるデータのサイズを制限していますが、IsoladStrageFile類が提供するIncrease QuotaTo法により、より大きな記憶空間を申請することができます.スペースの大きさはバイト単位で表しています.コードセグメントで示しています.独立した記憶空間は5 Mまで増加します.
using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())

            {

            long newQuetaSize = 5242880;

            long curAvail = store.AvailableFreeSpace;

            if (curAvail < newQuetaSize)

            {

            store.IncreaseQuotaTo(newQuetaSize);

            }

            }
空間を増やそうとすると、ブラウザが確認ダイアログを開きます.独立した保存空間の大きさを増やすことができるかどうかを確認します.
 
ファイルはどこに保存されますか?
独立して保存するなら、クライアントのローカルに保管されていますが、どこに保管されていますか?私のパソコンの住所はC:\Users\TerryLee\AppData\Local Low\Microsoft\Silverlight\is\035 ks 51 b.2 q 4\pksdhgurx\1で、マシンによって若干の変化があります.gフォルダの下に、現在のアプリケーションのいくつかの公有情報を見つけました.次の3つのファイルがあります.
id.datは現在のアプリケーションのIDを記録しています.
quot.datは、現在のアプリケーションが独立して保存されているクォータ、すなわち記憶空間サイズを記録しています.
used.datは使用済みスペースを記録します.
もう一つのsフォルダの下に私達が作成したディレクトリとファイルが見つかります.そしてファイルを開けて保存された内容を見ることができます.
独立した保存を無効にする
独立したストレージがCookie機構と似た局所的信頼機構である以上、独立したストレージを無効にしてもいいですか?答えはもちろん肯定です.Silverlightアプリケーションで右クリックすると、Silverlight Configrationメニューが選択され、次のようなウィンドウが表示されます.
ここでは、各アプリケーションの記憶空間の大きさと現在使用されている空間を見ることができます.アプリケーションが独立してデータを保存したり、独立して保存しない機能を削除できます.
個別記憶プロファイル
最後に、独立した記憶構成を簡単に説明します.Beta 1時代はアプリケーション構成であり、現在はアプリケーション構成だけではなく、サイト構成もサポートしています.各ページに表示されるようなアプリケーション構成のピクチャ数、ページレイアウトの自定的な構成などを記憶して、Isolated StrageSettingsクラスを使って実現できます.このクラスはデザインに辞書を使って名前と値のペアを記憶します.
IsolatedStorageSettings appSettings =

            IsolatedStorageSettings.ApplicationSettings;

            appSettings.Add("mykey","myValue");

            appSettings.Save();

            IsolatedStorageSettings siteSettings =

            IsolatedStorageSettings.SiteSettings;

            siteSettings.Add("mykey1","myValue1");

            siteSettings.Save();
独立したストレージ構成のメカニズムは、上で述べたように、ローカルファイルに基づいて格納されています.システムのデフォルトは、__u u u_という名前を作成します.Local Settingsのファイルを下の図のように保存します.
ファイルを開くと、保存されている内容が見えます.(ここで整理します.)
<ArrayOfKeyValueOfstringanyType

            xmlns:i="http://www.w3.org/2001/XMLSchema-instance"

            xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">

            <KeyValueOfstringanyType>

            <Key>mykey</Key>

            <Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema"

            i:type="d3p1:string">myValue</Value>

            </KeyValueOfstringanyType>

            </ArrayOfKeyValueOfstringanyType>
特に、独立したストレージ構成を使うことで、シンプルなタイプのデータだけでなく、カスタムタイプのデータも保存できます.
結び目
本論文では、Silverlight 2の独立したストレージメカニズムを詳しく紹介します.
ダウンロード例:
本記事は「TerryLee技術コラム」のブログから出ていますので、ぜひこの出典を保持してください.
http://terrylee.blog.51cto.com/342737/84585