出会いセンター ファイルに関する概要情報の取得(C#)

ファイルに関する概要情報の取得

WordやExcelファイルのプロパティウィンドウには”概要”タブが存在し、ファイルに関する付加的情報 を記録しておくことができることをご存知の方も多いと思いますが、ここではその概要タブに表示される情報の 取得と設定方法について解説します。

NTFSでは全てのファイルに”概要”情報を付加できる

Windows98などのFATファイルシステムを使用しているOSではOfficeドキュメント等の特殊なファイルにしか ”概要”情報を付加することはできませんでした。しかし、NTFSを使用しているWindows2000などのOS では全てのファイルに対してこの情報を付加することができます。これはNTFSが複数のストリームを ひとつのファイルとして管理する機構を備えているためです。まずこのあたりについて簡単に触れておきましょう。

NTFS上のファイルは通常メインストリームその他のストリームから構成されています。このメインストリーム というのはFATなどのNTFS以外のファイルシステムからでも認識できるストリームで、それ以外は NTFSのみから認識でき、複数のものをそれぞれ独立に登録することができます。 この機構を利用することでNTFSはそれぞれのファイルにに概要情報を記録しているのです。実際Windows2000などでは SummaryInformationという名前のストリームにこの情報が保存されています。

では、このストリームどうやってアクセスするのでしょうか?実は、Windows2000などでは非常に簡単にこのストリーム にアクセスする方法を提供しています。CreateFile()というAPI関数ではファイル名に次のような書式を用いることで通常のファイル と同様にアクセスすることができます。

[ファイル名]:[ストリーム名]
(例 test.txtというファイルのInformationというストリームの場合)
test.txt:Information

そうすると、概要情報もこのようにしてSummaryInformationストリームにアクセスすることで読み書きできるということに なります。しかし、この情報に直接アクセスするのは安全とはいえません。従って、その情報を読み書きするために提供されている方法について検討してみます。

C++からはIPropertyStorageのメソッドを使用する

この情報にアクセスする手段は当然APIとしても提供されており、IPropertyStorageなどのメソッドを使用することで安全にアクセスすることができます。 C/C++からはこれらを何の問題もなく利用できるので、是非利用するべきでしょう。しかし、C#からそうやすやす とはいきません。C#からこれらのAPI群を利用するためにはIPropertyStorageをはじめとする様々なインターフェース をC#用に定義しなおさなければいけません。ある程度はツールにより自動化できますが、少々骨の折れる作業になります。 そこで、以下のような方法が考えられます。

Officeドキュメントのみであれば、オートメーションを利用する

これはバックグラウンドでオートメーションを起動してドキュメントを開き プロパティの値を読み書きするという方法です。下記に詳しく解説されているので、ここでは 割愛します。
[HOWTO] オートメーションを使用して、Visual C# .NET で Office ドキュメントのプロパティを取得および設定する方法

Shellを利用する方法

これはShell32.dllから提供されるメソッドを使用する方法です。C#からはShell32.dllを参照設定することで 使用することができます。しかし、この方法では取得のみで設定はできません。また、いくつか 取得できない値もあり、あまり使い勝手がいいものではありません。以下のサンプルでは、 C:\test.txtが存在し、予め概要情報が記録されていることを前提にしています。

using System;
using Shell32;

namespace FileSummaryInfoViaShellClass
{
    class Class1
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            ShellClass shell = new ShellClass();
            FolderItem2 file = shell.NameSpace(@"C:\").ParseName("test.txt") asFolderItem2;
            Console.WriteLine("Title : " + file.ExtendedProperty("Title"));
            Console.WriteLine("Subject : " + file.ExtendedProperty("Subject"));
            Console.WriteLine("Author : " + file.ExtendedProperty("Author"));
            Console.WriteLine("Category : " + file.ExtendedProperty("Category"));
            Console.WriteLine("Comment : " + file.ExtendedProperty("Comment"));
        }
    }
}

Dsofile.dllを使用する方法

IPropertyStorage等をVBやC#から使用するのは面倒であることからMicrosoftでは概要情報にアクセスする専用のCOMコンポーネント を公開しています。下記を参照してください。
Dsofile.dll lets you edit Office document properties without Office in Visual Basic .NET 2003 and in Visual Basic .NET 2002

これを用いることで大抵のことはできるようになります。以下に簡単なサンプルを掲載しておきます。

using System;

namespace FileSummaryInfoViaDsofile
{
    class Class1
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            DSOFile.OleDocumentPropertiesClass ducProperty = new
                                                    DSOFile.OleDocumentPropertiesClass();
            DSOFile.SummaryProperties summary;
            // 書き込みのテスト
            try
            {
                Console.WriteLine("書き込み開始");
                ducProperty.Open(@"C:\test.txt", false,
                                 DSOFile.dsoFileOpenOptions.dsoOptionDefault);
                summary = ducProperty.SummaryProperties;
                summary.Title = "タイトル1";
                summary.Subject = "サブジェクト1";
                summary.Author = "作者1";
                summary.Keywords = "キーワード1";
                summary.Comments = "コメント1";
                summary.Category = "分類1";
                //summary.RevisionNumber = "改定番号1";
            }
            finally
            {
                ducProperty.Close(true);
                Console.WriteLine("書き込み終了");
            }

            // 読み込みのテスト
            try
            {
                Console.WriteLine("読み込み開始");
                ducProperty.Open(@"C:\test.txt", true,
                                 DSOFile.dsoFileOpenOptions.dsoOptionDefault);
                summary = ducProperty.SummaryProperties;
                Console.WriteLine("Title : " + summary.Title);
                Console.WriteLine("Subject : " + summary.Subject);
                Console.WriteLine("Author : " + summary.Author);
                Console.WriteLine("Keywords : " + summary.Keywords);
                Console.WriteLine("Comments : " + summary.Comments);
                Console.WriteLine("Category : " + summary.Category);
                Console.WriteLine("RevisionNumber : " + summary.RevisionNumber);
            }
            finally
            {
                ducProperty.Close(false);
                Console.WriteLine("読み込み終了");
            }
        }
    }
}
出会い 出会い 出会い系 出会い 出会い 出会い 出会い 出会い 出会い オオクワガタ 出会い 出会い 出会い 出会い アクセスカウンター 出会い 出会い 出会い系 出会い 出会い 出会い 出会い 出会い 出会い