IPropertySetStorage-NTFS ファイル システムの実装
NTFS バージョン 5.0 は、ファイル自体が複合ファイルでない場合に、NTFS ボリューム上のファイルに対して IPropertySetStorage の実装を提供します。 NTFS の実装は、 複合ファイルの実装と同じです。 例外の詳細については、「解説」を参照してください。
IPropertySetStorage の NTFS 実装へのポインターを取得するには
- StgCreateStorageEx を呼び出し、grfFlags パラメーターにSTGFMT_FILEを指定して新しいファイルを作成します。
- StgOpenStorageEx を呼び出し、grfFlags パラメーターにSTGFMT_FILEまたはSTGFMT_ANY列挙値のいずれかを指定して、既存のファイルを開きます。
ただし、複合ファイルの IPropertySetStorage の NTFS 実装を取得することはできません。 StgOpenStorage を使用して複合ファイルを開くと、STGFMT_FILE列挙値を指定するとエラーが発生します。
また、単純なプロパティ セットはトランザクションできません。 つまり、create メソッドと Open メソッドの grfmode パラメーターでSTGM_TRANSACTEDを指定することはできません。ただし、grfFlags パラメーターに PROPSETFLAG_NONSIMPLEも指定しない限りです。 プロパティ セットのストレージ オブジェクト自体は、トランザクション処理をサポートしていません。
使用するタイミング
IPropertySetStorage メソッドを呼び出して、現在の NTFS プロパティ セット ストレージ内のプロパティ セットを作成、開く、または削除します。 また、ストレージ内のプロパティ セットを列挙するために使用できる列挙子へのポインターを提供するメソッド IPropertySetStorage::Enum もあります。
互換性
Windows 2000 以降では、 IPropertySetStorage と IPropertyStorage の NTFS 実装を使用できます。 以前のバージョンでは、これらのプロパティ セットにアクセスできません。
NTFS 実装では、NTFS ファイルの代替ストリームにプロパティ セットが格納されます。 メイン ファイルをコピーするときは、代替ストリームをコピーする必要があります。
注意事項
すべてのファイル システムがこのようなストリームをサポートしているわけではありません。 プロパティ セットを含む NTFS ファイルが FAT ボリュームにコピーされた場合、ファイル内のデータのみがコピーされます。プロパティ セットが失われます。 この場合、 CopyFile 関数はエラーを返しません。
注意事項
ファイル コピーを実行しているコンピューターが Windows 2000 以降で実行されているコンピューターでない場合、プロパティ セットが失われる可能性があります。 たとえば、Windows 95 オペレーティング システムで実行されているコンピューターが NTFS ファイルをコピーした場合、ターゲット ファイルも NTFS ボリューム上にある場合でも、プロパティ セットは失われます。
メソッド
IPropertySetStorage の NTFS ファイル システムの実装では、次のメソッドがサポートされています。
-
現在の NTFS ファイル ストレージに新しいプロパティ セットを作成し、戻り値として 、IPropertyStorage NTFS ファイル実装へのインターフェイス ポインターを提供します。 grfmode パラメーターで指定された共有モードはSTGM_SHARE_EXCLUSIVEする必要があります。
-
現在のプロパティ ストレージ内の既存のプロパティ セットを開きます。 返されると、 IPropertyStorage の NTFS ファイル実装へのインターフェイス ポインターが提供されます。 grfmode パラメーターで指定された共有モードはSTGM_SHARE_EXCLUSIVEする必要があります。
-
現在のプロパティ ストレージ内のプロパティ セットを削除します。
-
STATPROPSETSTG 構造体を列挙するために使用するオブジェクトを作成します。 各 STATPROPSETSTG 構造体は、1 つのプロパティ セットに関するデータを提供します。
解説
IPropertySetStorage と IPropertyStorage の NTFS 実装は、そのファイルの内容に影響を与えずにファイル内のプロパティ セットを格納します。 たとえば、Default.htm という名前の HTML ファイルにプロパティ セットを作成した場合でも、そのファイルは Web ブラウザーに正しく表示されます。 つまり、 CreateFile 関数を使用してファイルにアクセスする場合、これら 2 つのインターフェイスを使用したファイルへの変更は検出できません。
IPropertySetStorage の NTFS 実装は、NTFS バージョン 5.0 ボリューム上のファイルにプロパティ セットを書き込むときに安全な実装を提供します。 このようなプロパティ セットは、システム障害が発生した場合でも、実装によって破損することはできません。 たとえば、プロパティ セットがディスクにフラッシュされている間に IPropertyStorage::Commit の呼び出し中にシステムの電源が失敗した場合、プロパティ セットは中間状態のままになることはありません。 プロパティ セットの以前のバージョンが残っているか、すべての更新プログラムが保存されます。
IPropertySetStorage の NTFS 実装は、次の点で複合ファイルの実装とは異なります。
IEnumSTATPROPSETSTG インターフェイスから取得した STATPROPSETSTG 構造体には、値が常に 0 (CLSID_NULL) の clsid メンバーが含まれています。 複合ファイルの実装では、単純でない場合は正しい clsid メンバーが返されます ( 「プロパティ セットのストレージオブジェクトとストリーム オブジェクト」を参照してください)。
StgCreateStorageEx または StgOpenStorageEx 関数を使用して IPropertySetStorage インターフェイス ポインターの NTFS 実装を取得する場合、grfmode パラメーターは複合ファイルの実装と同じ規則に従う必要があります。
また、次のフラグは使用できません。
STGM_SIMPLE、 STGM_TRANSACTED、 STGM_CONVERT、 STGM_PRIORITY、 STGM_DELETEONRELEASE。
NTFS IPropertySetStorage インターフェイスが StgCreateStorageEx または StgOpenStorageEx 関数によって取得される場合、共有モードは主にそのインターフェイスの他のインスタンスに適用され、ファイル自体を開くインスタンスには適用されません。 たとえば、stgOpenStorageEx 関数を呼び出して NTFS IPropertySetStorage インターフェイスを開き、grfmode パラメーターを STGM_READWRITE| に設定するとします。STGM_SHARE_EXCLUSIVE、CreateFile 関数を使用してファイルを開くこともできます。
このインターフェイスを開くときのこのような同時インスタンスには、次の制約が適用されます。CreateFile 関数の dwShareMode パラメーターは、FILE_SHARE_READ フラグを指定する必要があり、dwAccess パラメーターは DELETE フラグを指定しないでください。 また、 DeleteFile 関数と MoveFile 関数は、これらのプロパティ セット インターフェイスが開かれているファイルでは呼び出さないでください。これらの関数にはファイルへの DELETE アクセスが必要です。
NTFS IPropertySetStorage メソッドが読み取り専用として開かれている場合、ファイルに現在プロパティ セットがない場合、返されるオブジェクトは実際にはファイルを開いたままになりません。 その結果、元のオープン操作の共有モードが拒否された場合でも、そのファイルの他のオープンは成功します。
例;NTFS IPropertySetStorage がモード STGM_READ で開かれている場合 |STGM_SHARE_EXCLUSIVE、ファイルにプロパティ セットがないため、ファイルを同時に開STGM_READWRITE |STGM_SHARE_EXCLUSIVE。
関連トピック