仮想化ルートのキャッシュ状態
プロバイダーは、仮想化ルートの下にあるローカル ファイル システムを、管理する項目のキャッシュとして使用します。 項目 (ファイルまたはディレクトリ) は、ローカル ファイル システム上の 6 つの状態のいずれかになります。
バーチャル
項目はディスク上にローカルに存在しません。 これは、親ディレクトリの列挙中に投影されます (つまり、合成されます)。 仮想項目は、親ディレクトリの完全な内容を表示するためにディスク上に存在する可能性のある項目とマージされます。
プレースホルダ
ファイルの場合: ファイルのコンテンツ (プライマリ データ ストリーム) がディスクに存在しません。 ファイルのメタデータ (名前、サイズ、タイムスタンプ、属性など) はディスクにキャッシュされます。
ディレクトリの場合: ディレクトリの直属の子孫 (ディレクトリ内のファイルとディレクトリ) の一部または全部がディスク上に存在しません。つまり、それらはまだ仮想的です。 ディレクトリのメタデータ (名前、タイムスタンプ、属性など) はディスクにキャッシュされます。
ハイドレートされたプレースホルダー
ファイルの場合: ファイルのコンテンツとメタデータがディスクにキャッシュされています。 "部分ファイル" とも呼ばれます。
ディレクトリの場合: プレースホルダーとしてディスク上に作成されたディレクトリは、ハイドレートされたプレースホルダー ディレクトリになることはありません。 これにより、プロバイダーはバッキング ストア内のディレクトリに項目を追加または削除し、それらの変更をローカル キャッシュに反映できます。
ダーティ プレースホルダー (ハイドレートされているかどうか)
アイテムのメタデータはローカルで変更されており、プロバイダーのストアでの状態のキャッシュではなくなりました。 プレースホルダー ディレクトリの下にファイルまたはディレクトリを作成または削除すると、プレースホルダー ディレクトリがダーティになることに注意してください。
完全なファイル/ディレクトリ
ファイルの場合: ファイルのコンテンツ (プライマリ データ ストリーム) が変更されました。 ファイルは、プロバイダーのストア内の状態のキャッシュではなくなりました。 ローカル ファイル システム上に作成されたファイル (つまり、プロバイダーのストアにまったく存在しないファイル) も、完全なファイルと見なされます。
ディレクトリの場合: ローカル ファイル システムで作成されたディレクトリ (つまり、プロバイダーのストアにまったく存在しないディレクトリ) は、完全なディレクトリと見なされます。 プレースホルダーとしてディスク上に作成されたディレクトリが完全なディレクトリになることはありません。
墓石
ローカル ファイル システムから削除されたアイテムを表す特殊な非表示のプレースホルダー。 ディレクトリが列挙されると、ProjFS はローカル項目のセット (プレースホルダー、完全なファイルなど) を仮想投影項目のセットとマージします。 項目がローカル セットと投影セットの両方に表示される場合は、ローカル項目が優先されます。 ローカル ファイル システムにファイルが存在しない場合は、ローカル状態がないため、列挙型に表示されます。 ただし、その項目が削除されている場合は、列挙型に表示されることは予期しない結果になります。 削除されたアイテムを廃棄石に置き換えると、次の効果が得られます。
- アイテムを表示しない列挙体。
- 項目が存在することを予期するファイルが開き、"file not found" などのエラーが発生します。
- ファイルは、アイテムが存在しない場合にのみ成功することを想定して作成します。ProjFS は、操作の一部として廃棄石を削除します。
上記の状態を示すために、仮想化ルート C:\root にある 1 つのファイル "foo.txt" を持つ ProjFS プロバイダーを考えて、次のシーケンスを検討します。
- アプリは C:\root を列挙します。 仮想ファイル "foo.txt" が表示されます。 ファイルにはまだアクセスされていないため、ファイルはディスク上に存在しません。
- アプリは、C:\root\foo.txtするハンドルを開きます。 ProjFS は、プロバイダーにプレースホルダーを作成するよう指示します。
- アプリはファイルの内容を読み取ります。 プロバイダーは ProjFS にファイルコンテンツを提供し、C:\root\foo.txtにキャッシュされます。 これで、ファイルはハイドレートされたプレースホルダーになりました。
- アプリは、最終更新日時のタイムスタンプを更新します。 これで、ファイルはダーティ ハイドレートされたプレースホルダーになりました。
- アプリは、ファイルへの書き込みアクセス用のハンドルを開きます。 C:\root\foo.txt は完全なファイルになりました。
- アプリは C:\root\foo.txtを削除します。 ProjFS は、ファイルを廃棄石に置き換えます。 アプリが C:\root it does not see foo.txtを列挙したとき。 ファイルを開こうとすると、開くERROR_FILE_NOT_FOUNDで失敗します。