仮想化ルートのキャッシュ状態

プロバイダーは、仮想化ルートの下にあるローカル ファイル システムを、管理する項目のキャッシュとして使用します。 項目 (ファイルまたはディレクトリ) は、ローカル ファイル システム上の 6 つの状態のいずれかになります。

  • 仮想

    項目がディスク上にローカルに存在しません。 これは、親ディレクトリの列挙中に投影されます。つまり、合成されます。 仮想アイテムは、親ディレクトリの完全な内容を表示するためにディスク上に存在する可能性のある項目とマージされます。

  • プレースホルダー

    ファイルの場合: ファイルのコンテンツ (プライマリ データ ストリーム) がディスクに存在しません。 ファイルのメタデータ (名前、サイズ、タイムスタンプ、属性など) はディスクにキャッシュされます。

    ディレクトリの場合: ディレクトリの直接の子孫 (ディレクトリ内のファイルとディレクトリ) の一部またはすべてがディスク上に存在しません。つまり、それらはまだ仮想です。 ディレクトリのメタデータ (名前、タイムスタンプ、属性など) はディスクにキャッシュされます。

  • ハイドレートされたプレースホルダー

    ファイルの場合: ファイルのコンテンツとメタデータがディスクにキャッシュされています。 "部分ファイル" とも呼ばれます。

    ディレクトリの場合: プレースホルダーとしてディスク上に作成されたディレクトリは、ハイドレートされたプレースホルダー ディレクトリになることはありません。 これにより、プロバイダーはバッキング ストア内のディレクトリに項目を追加または削除し、それらの変更をローカル キャッシュに反映できます。

  • ダーティ プレースホルダー (ハイドレートされているかどうか)

    アイテムのメタデータはローカルで変更されており、プロバイダーのストア内の状態のキャッシュではなくなりました。 プレースホルダー ディレクトリの下にファイルまたはディレクトリを作成または削除すると、そのプレースホルダー ディレクトリがダーティされることに注意してください。

  • 完全なファイル/ディレクトリ

    ファイルの場合: ファイルのコンテンツ (プライマリ データ ストリーム) が変更されました。 ファイルは、プロバイダーのストア内の状態のキャッシュではなくなりました。 ローカル ファイル システムで作成されたファイル (つまり、プロバイダーのストアにまったく存在しないファイル) も、完全なファイルと見なされます。

    ディレクトリの場合: ローカル ファイル システム上に作成されたディレクトリ (つまり、プロバイダーのストアにまったく存在しないディレクトリ) は、完全なディレクトリと見なされます。 プレースホルダーとしてディスク上に作成されたディレクトリが完全なディレクトリになることはありません。

  • 廃棄

    ローカル ファイル システムから削除されたアイテムを表す特殊な非表示プレースホルダー。 ディレクトリが列挙されると、ProjFS はローカル項目のセット (プレースホルダー、完全なファイルなど) を一連の仮想投影項目とマージします。 項目がローカル セットと投影セットの両方に表示される場合は、ローカルアイテムが優先されます。 ローカル ファイル システムにファイルが存在しない場合は、ローカル状態がないため、列挙に表示されます。 ただし、その項目が削除されている場合は、列挙にアイテムを表示すると予期しない可能性があります。 削除されたアイテムを廃棄石に置き換えると、次の効果が得られます。

    • アイテムを表示しない列挙。
    • アイテムが存在することを想定するファイルが開き、"ファイルが見つかりません" などのエラーが発生します。
    • ファイルは、アイテムが存在しない場合にのみ成功することを期待する を作成します。ProjFS は、操作の一部として廃棄石を削除します。

上記の状態を説明するために、仮想化ルート C:\root に 1 つのファイル "foo.txt" がある ProjFS プロバイダーを考えて、次のシーケンスを検討してください。

  1. アプリは C:\root を列挙します。 仮想ファイル "foo.txt" が表示されます。 ファイルにはまだアクセスされていないため、ファイルはディスク上に存在しません。
  2. アプリは、C:\root\foo.txtするハンドルを開きます。 ProjFS は、プロバイダーにプレースホルダーを作成するように指示します。
  3. アプリはファイルの内容を読み取ります。 プロバイダーは ProjFS にファイルコンテンツを提供し、C:\root\foo.txtにキャッシュされます。 ファイルがハイドレートされたプレースホルダーになりました。
  4. アプリは、最終更新日時のタイムスタンプを更新します。 ファイルは、ダーティハイドレートされたプレースホルダーになりました。
  5. アプリは、ファイルへの書き込みアクセス用のハンドルを開きます。 C:\root\foo.txtが完全なファイルになりました。
  6. アプリはC:\root\foo.txtを削除します。 ProjFS は、ファイルを廃棄石に置き換えます。 アプリが C:\root を列挙すると、foo.txtは表示されません。 ファイルを開こうとすると、開くはERROR_FILE_NOT_FOUNDで失敗します。