執筆者: エディフィストラーニング株式会社 矢嶋 聡

動作確認環境: .NET Framework 4, Visual Studio 2010, Windows 7

更新日: 2010 年 3 月 12 日


Windows 7 では、物理的に分散した複数のフォルダーを 1 つの論理的なコレクションとして効率よく管理するために「ライブラリ」が導入されました。ライブラリを管理するには、エクスプローラーから手動で操作できるほか、プログラムからも制御できます。ここでは、.NET Framework 対応のプログラムから、ライブラリを新規作成する方法を示します。

Windows 7 のライブラリを制御する API は、ネイティブコードの API である Windows Shell API の一部として提供されています。.NET Framework 対応プログラムからこれらの API を利用するには、プラットフォーム呼び出し (P/Invoke) や COM 相互運用機能を使用したラッパーを介してアクセスする必要があります。現在、これらの API のラッパーとして Windows API Code Pack for Microsoft .NET Framework が MSDN Code Gallery に公開されています (以降は Windows API Code Pack と表記)。このラッパーは、.NET Framework 3.5 SP1 以降の環境 (Visual Studio 2010 または Visual Studio 2008 SP1) で利用できます。これを使用して、ライブラリを新規作成するサンプル コードを以下に示します。

Note: Windows API Code Pack は次のアドレスからダウンロードすることができます。

http://code.msdn.microsoft.com/WindowsAPICodePack (英語) (2010 年 2 月現在、v1.0.1)

ここで使用するサンプルでは、次図のフォルダー階層のとおり、C:\ドライブの直下に "Document1" および "Document2" という名前の 2 つのフォルダーが存在することを前提に、これらを "MyLib" という名前のライブラリとして 1 つのコレクションにまとめることにします。(各フォルダーには、後からライブラリ構成を確認しやすいように、適当なファイルを追加しておくとよいでしょう。)

図 1. サンプル コードのライブラリが対象とするフォルダー階層

このサンプルでは、Visual Studio 2010 の WPF アプリケーション プロジェクトを使用します。まず、このプロジェクトから Windows API Code Pack の Windows Shell API 関連のラッパーを使用するには、以下のアセンブリに対して参照設定 (参照の追加) を行います。

  • Microsoft.WindowsAPICodePack.dll
  • Microsoft.WindowsAPICodePack.Shell.dll

Note: 上記のアセンブリ ファイルは、入手した Windows API Code Pack に含まれるソリューション "WindowsAPICodePack.sln" をビルドすることで、以下のパスに出力されます。

\WindowsAPICodePack\Shell\bin\Debug または \WindowsAPICodePack\Shell\bin\Release

前述の参照設定を行ったことを前提に、ライブラリを新規作成するサンプル コードを次に示します。ここでは、WPF ベースのウィンドウに 1 つのボタンを配置して、そのボタンの Click イベント ハンドラーにコードを記述しています。また簡単にするため、ライブラリ名 "MyLib" や追加する物理パス ("C:\Documents1" など) はハード コーディングしています。

例 1. C#

C#
using Microsoft.WindowsAPICodePack.Shell;    ←[1] 
 
   : (省略) 
 
private void button1_Click(object sender, EventArgs e) ←Clickイベントハンドラ 
{ 
    using (var library = new ShellLibrary("MyLib"false))    ←[2] 
    { 
        library.Add(@"C:\Documents1");    ←[3] 
        library.Add(@"C:\Documents2"); 
    } 
} 
 
 

[1] では、クラスの完全修飾名を使用せずに済ませるため、Windows 7 のライブラリ関連の名前空間 Microsoft.WindowsAPICodePack.Shell のインポート (使用) を宣言しています。

ライブラリを制御する主要なオブジェクトは、[2] の ShellLibrary クラスのインスタンスです。このインスタンスのコンストラクターの 1 番目の引数には、ライブラリの名前 (ここでは "MyLib") を指定します。2 番目の引数は、既存の同名ライブラリに対して強制的に上書きする場合に True を指定します。ここでは False を指定したので、既に同名のライブラリが存在していた場合には例外が発生し、上書きを防止できます。

Note: ここでは基本的な操作手順を分かりやすくするため、例外処理の記述は省略しました。本来であれば、例外が発生した場合のメッセージの表示や、利用者が問題解決するための操作の提示など実装する必要があります。

[2] のように New キーワードを用いて ShellLibrary インスタンスを作成したタイミングで、ライブラリが新規に作成されます。この ShellLibrary インスタンスは、ネイティブ API に対するラッパーであり、最終的にネイティブ リソースを解放するために、ShellLibrary インスタンスの Dispose メソッドを呼び出す必要があります。そのために、[2] では Using ブロックを使用しており、このブロックの処理が終了すると自動的に Dispose メソッドが呼び出されます。

さらに [3] から始まる 2 行では ShellLibrary インスタンスの Add メソッドを呼び出して 2 つの物理パス (ここでは "C:\Documents1" と "C:\Documents2") をライブラリに追加しています。

このコードを実行した後、エクスプローラーの「ライブラリ」には、次図のように "MyLib" ライブラリが表示されます。

図 2. 新規作成された "MyLib" ライブラリ

また、"MyLib" ライブラリの中を表示すると、既定の表示形式では、次図のようにライブラリに追加した物理フォルダーごとにグループ化されて表示されます。

図 3. ライブラリに追加された "Documents1" フォルダーと "Documents2" フォルダー

なお、前図の表示状態の際に、右側ビューの中の右端辺りの余白で右クリックし、ショートカット メニューから [グループで表示] メニューの [(なし)] をクリックして、グループ化を解除すると、次の図 4 のように右側のビューには、2 つの物理フォルダーの中にあったサブ フォルダーが 1 つのライブラリの中にまとめられ、同一階層のコレクションのように表示されます。(ただし、左側のツリーでは、本来の追加された 2 つの物理フォルダーを確認できます。)

図 4. ライブラリ内に取りまとめられた各サブ フォルダー

Note: 図 4 の状態から、図 3 のように元のフォルダーごとにグループ化した状態の表示に戻すには、右上部の [フォルダー] ドロップダウン メニューから、[変更をクリア] をクリックします。


Code Recipe Code Recipe

ページのトップへ