.NET TIPS

分離ストレージを活用するには?[C#、VB]

デジタルアドバンテージ 一色 政彦
2007/04/05

  .NET Frameworkには、「分離ストレージ(Isolated Storage)」と呼ばれる、データの保存環境(データ保存の仕組み)がある。分離ストレージはWindowsシステム上に作成される「仮想的な(=システム環境とは分離された)ストレージ環境」で、これを利用すれば、データの保存に関する次のような効果が得られる。

  • ほかのアプリケーションの目から隠ぺいできる
    → データの保存場所がほかのアプリケーションに簡単には知られにくくなるため、未知のアプリケーションから保存データに不用意にアクセスされるのを避けたい場合には便利。

  • 一般のユーザーの目から隠ぺいできる
    → エンド・ユーザーが誤って保存データを破壊する可能性が小さくなる。

 また、分離ストレージは.NET Frameworkのセキュリティ機構に守られており、(ファイル・システムへのアクセスが許可されていないような)低いセキュリティ権限しか持っていないユーザーでも利用可能だという特徴がある。そのため、主にノータッチ・デプロイメントや(オンライン実行の)ClickOnceを使ったアプリケーションなど、アクセス許可が厳しく制限されたアプリケーションにおけるデータの保存方法として活用されたり、設定情報などの保存場所として活用されたりする。ただし分離ストレージの注意点として、データが暗号化されるわけではないので、重要な機密情報などは格納しない方がよい。

 なお分離ストレージは、.NET Framework 2.0で(1.xのころと比べて)その機能が強化されている。本稿では分離ストレージの基本的な活用方法を詳解することに主眼を置き、.NET Framework 1.xでも使える内容のみを解説する。.NET Framework 2.0で拡張された部分については後日に別のTIPSで紹介する予定だ。

利用可能な分離ストレージの領域の種類について

 分離ストレージへのアクセスには厳格な制限がある。分離ストレージは、(基本的に)まず「ユーザーごと」に、次に「アプリケーション・ドメインごと」、さらに「アセンブリごと」の順に細かく領域が切り分けられ、アクセスが制限される(この制限はノータッチ・デプロイメント/ClickOnceにおけるコード・アクセス・セキュリティの「インターネット・ゾーン」で許可されているセキュリティ制限に該当する)。つまり、ユーザー間どころか、アプリケーション・ドメイン間(=アプリケーション間)や、アセンブリ間(=.DLLファイル間)でもデータを共有できないということである。

 そのほか、これより少し緩い制限も用意されている。この制限では、「アプリケーション・ドメインごと」を外して、「ユーザー → アセンブリ」の切り分けが行われる(この制限はノータッチ・デプロイメント/ClickOnceにおけるコード・アクセス・セキュリティの「イントラネット・ゾーン」で許可されているセキュリティ制限に該当する)。これを利用すれば、分離ストレージを使って複数のアプリケーション間でデータを共有することが可能になる。ただし、同一ユーザーが、同一のアセンブリ経由で分離ストレージにアクセスする場合においてのみにしか適用されないので注意が必要だ。

 .NET Framework 1.xでは、分離ストレージの領域を上記2種類のどちらかしか選択できなかった。しかし、.NET Framework 2.0ではこの2種類に加えて、(ユーザー、アプリケーション・ドメイン、アセンブリの)さまざまな組み合わせが提供されおり、ユーザー間やアプリケーション間でも分離ストレージを共有できるようになっている(これについては、後日あらためて紹介する)。

 それでは分離ストレージを活用する方法を説明していこう(本稿では.NET Framework 1.xでも使える内容のみを解説し、.NET Framework 2.0で拡張された部分については説明しない)。

分離ストレージの活用法(データの書き込み)

 分離ストレージは、その内部にファイル(Isolated Storage File)を作成して活用する。そのファイルにデータを書き込んだり、そこからデータを読み取ったりするわけである。

 まずは分離ストレージ内のファイルにデータを書き込んでみよう。

 これには、StreamWriterクラス(System.IO名前空間)を使ってストリーム経由で書き込むことになる。StreamWriterオブジェクトを作成するには、まずIsolatedStorageFileStreamクラス(System.IO.IsolatedStorage名前空間)のストリーム・オブジェクトを生成し、次にそのストリーム・オブジェクトをStreamWriterクラスのコンストラクタに渡して、目的のStreamWriterオブジェクトを生成(new)する必要がある。

 IsolatedStorageFileStreamオブジェクトは、次のパラメータを指定したコンストラクタを使って生成(new)する。

・第1パラメータ:

ファイル・パス名を文字列で指定する。

・第2パラメータ:

ファイルを開く方法を、FileMode列挙体(System.IO名前空間)の値で指定する。例えば、ファイルがない場合には新規作成、既に存在する場合にはそれを開くようにしたいときには、「OpenOrCreate」という値を指定すればよい。そのほかの値については、MSDN「FileMode 列挙体」を参照されたい。

・第3パラメータ:

読み取り/書き込みのアクセス許可を、FileAccess列挙体(System.IO名前空間)の値で指定する。読み取りだけ許可したい場合は「Read」、書き込みだけ許可したい場合は「Write」、両方とも許可したい場合は「ReadWrite」を指定する。

・第4パラメータ:

分離ストレージ環境を表すIsolatedStorageFileクラス(System.IO.IsolatedStorage名前空間)のオブジェクトを指定する。

 第4パラメータに指定するIsolatedStorageFileオブジェクトは、IsolatedStorageFileクラスの静的メソッドGetUserStoreForDomain(パラメータなし)を呼び出せば、その戻り値で受け取ることができる(ちなみに、「ユーザー → アセンブリ」で切り分けた分離ストレージを使う場合、つまり複数のアプリケーション間でデータを共有したい場合には、GetUserStoreForAssemblyメソッドを使えばよい)。

 この一連の流れを実際にコードにしたのが次のサンプル・プログラムだ。

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

class Program
{
  static void Main()
  {
    // 分離ストレージ環境を取得
    IsolatedStorageFile isoStore =
      IsolatedStorageFile.GetUserStoreForDomain();

    // (分離ストレージ内のファイルへの)ストリームを開く
    IsolatedStorageFileStream isoStream =
      new IsolatedStorageFileStream(
        "FileName.txt",
        FileMode.OpenOrCreate,
        FileAccess.Write,
        isoStore);

    // ストリーム経由でデータを書き込む
    using (StreamWriter writer = new StreamWriter(isoStream))
    {
      writer.WriteLine("データを……");
      writer.WriteLine("書き込みました!");
    }

    // ストリームを閉じる
    isoStream.Close();

    // 分離ストレージ環境を解放
    isoStore.Dispose();
  }
}
Imports System.IO
Imports System.IO.IsolatedStorage

Module Module1

  Sub Main()
    ' 分離ストレージ環境を取得
    Dim isoStore As IsolatedStorageFile = _
      IsolatedStorageFile.GetUserStoreForDomain()

    ' (分離ストレージ内のファイルへの)ストリームを開く
    Dim isoStream As New IsolatedStorageFileStream( _
      "FileName.txt", _
      FileMode.OpenOrCreate, _
      FileAccess.Write, _
      isoStore)

    ' ストリーム経由でデータを書き込む
    Dim writer As New StreamWriter(isoStream)
    writer.WriteLine("データを……")
    writer.WriteLine("書き込みました!")
    writer.Close()

    ' ストリームを閉じる
    isoStream.Close()

    ' 分離ストレージ環境を解放
    isoStore.Dispose()
  End Sub

End Module
データの書き込みを行う分離ストレージのサンプル・プログラム(上:C#、下:VB)

 注意点としては、最後にIsolatedStorageFileオブジェクトのDisposeメソッドを呼び出して、分離ストレージ環境を解放することだ。これを行わないと、ストリーム・オブジェクト(IsolatedStorageFileStreamオブジェクト)が使用するリソースが、ガベージ・コレクションが働くまで解放されない。

分離ストレージの活用法(データの読み取り)

 次に分離ストレージ内のファイルに格納されたデータの読み取りだが、その方法は書き込み方法とほぼ同じなので、細かな説明は割愛する。ここでは相違点についてだけ言及しておこう。読み取り方法で異なるのは、IsolatedStorageFileStreamオブジェクトを生成する際のコンストラクタで「FileAccess.Read」などの読み取り許可を指定することと、データをストリーム経由で読み取るためにStreamReaderクラス(System.IO名前空間)を使うことである。

 次のコードは、実際に分離ストレージ内のファイルに格納されたデータを読み取るサンプル・プログラムだ。

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

class Program
{
  static void Main()
  {
    // 分離ストレージ環境を取得
    IsolatedStorageFile isoStore =
      IsolatedStorageFile.GetUserStoreForDomain();

    // (分離ストレージ内のファイルへの)ストリームを開く

    IsolatedStorageFileStream isoStream =
      new IsolatedStorageFileStream(
        "FileName.txt",
        FileMode.Open,
        FileAccess.Read,
        isoStore);

    // ストリーム経由でデータを読み取る
    using (StreamReader reader = new StreamReader(isoStream))
    {
        Console.WriteLine(reader.ReadLine());
        Console.WriteLine(reader.ReadLine());
    }

    // ストリームを閉じる
    isoStream.Close();

    // 分離ストレージ環境を解放
    isoStore.Dispose();
  }
}
Imports System.IO
Imports System.IO.IsolatedStorage

Module Module1

  Sub Main()
    ' 分離ストレージ環境を取得
    Dim isoStore As IsolatedStorageFile = _
      IsolatedStorageFile.GetUserStoreForDomain()

    ' (分離ストレージ内のファイルへの)ストリームを開く
    Dim isoStream As New IsolatedStorageFileStream( _
      "FileName.txt", _
      FileMode.Open, _
      FileAccess.Read, _
      isoStore)

    ' ストリーム経由でデータを読み取る
    Dim reader As New StreamReader(isoStream)
    Console.WriteLine(reader.ReadLine())
    Console.WriteLine(reader.ReadLine())
    reader.Close()

    ' ストリームを閉じる
    isoStream.Close()

    ' 分離ストレージ環境を解放
    isoStore.Dispose()
  End Sub

End Module
データの読み取りを行う分離ストレージのサンプル・プログラム(上:C#、下:VB)

 前掲の「データの書き込みを行う分離ストレージのサンプル・プログラム」でデータを書き込んでいた場合に、この「データの読み取りを行う分離ストレージのサンプル・プログラム」を実行すると、次のような出力が得られる。

データを……
書き込みました!

分離ストレージの活用法(ファイルの破棄)

 最後に作成した分離ストレージ内のファイルを削除する方法を示しておこう。

 これにはIsolatedStorageFileオブジェクトのDeleteFileメソッドを呼び出すだけだ。DeleteFileメソッドはそのパラメータにファイル・パス名を受け取る。

 次のコードは実際に分離ストレージ内のファイルを削除するサンプル・プログラムである。

using System;
using System.IO.IsolatedStorage;

class Program
{
  static void Main()
  {
    // 分離ストレージ環境を取得
    IsolatedStorageFile isoStore =
      IsolatedStorageFile.GetUserStoreForDomain();

    //分離ストレージからファイルを削除します
    isoStore.DeleteFile("FileName.txt");

    // 分離ストレージ環境を解放
    isoStore.Dispose();
  }
}
Imports System.IO.IsolatedStorage

Module Module1

  Sub Main()
    ' 分離ストレージ環境を取得
    Dim isoStore As IsolatedStorageFile = _
      IsolatedStorageFile.GetUserStoreForDomain()

    '分離ストレージからファイルを削除します
    isoStore.DeleteFile("FileName.txt")

    ' 分離ストレージ環境を解放
    isoStore.Dispose()
  End Sub

End Module
分離ストレージ内のファイルを削除するサンプル・プログラム(上:C#、下:VB)

 なお、分離ストレージ内にディレクトリを作成して、ファイルを階層管理することもできる。これについては後日あらためて紹介する予定だ。End of Article

カテゴリ:クラス・ライブラリ 処理対象:分離ストレージ
使用ライブラリ:IsolatedStorageFileクラス(System.IO.IsolatedStorage名前空間)
使用ライブラリ:IsolatedStorageFileStreamクラス(System.IO.IsolatedStorage名前空間)
使用ライブラリ:
StreamWriterクラス(System.IO名前空間)
使用ライブラリ:StreamReaderクラス(System.IO名前空間)
使用ライブラリ:FileMode列挙体(System.IO名前空間)
使用ライブラリ:FileAccess列挙体(System.IO名前空間)

この記事と関連性の高い別の.NET TIPS
すべての分離ストレージ環境をクリーンアップするには?
分離ストレージでディレクトリを使うには?
分離ストレージの容量を調べるには?
[ASP.NET]ページから生成されたソース・コードを見るには?
アプリケーション設定を活用するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間