虚拟化根目录中的缓存状态

提供程序使用虚拟化根目录下的本地文件系统作为其管理的项的缓存。 项(文件或目录)可以位于本地文件系统的六个状态之一:

  • 虚拟

    该项在磁盘上不存在。 在枚举其父目录期间,它被投影,即合成的。 虚拟项与磁盘上可能存在的任何项合并,以呈现父目录的完整内容。

  • 占 位 符

    对于文件:文件的内容(主数据流)不在磁盘上。 文件的元数据(名称、大小、时间戳、属性等)缓存在磁盘上。

    对于目录:磁盘上不存在部分或所有目录的直接后代(目录中的文件和目录),即它们仍然是虚拟的。 目录的元数据(名称、时间戳、属性等)缓存在磁盘上。

  • 水合占位符

    对于文件:文件的内容和元数据已缓存到磁盘。 也称为“部分文件”。

    对于目录:作为占位符在磁盘上创建的目录永远不会成为冻结占位符目录。 这允许提供程序在其后盾存储区中添加或删除目录中的项,并将这些更改反映在本地缓存中。

  • 脏占位符 (水化或不水合物)

    项的元数据已在本地修改,并且不再是提供程序存储中其状态的缓存。 请注意,在占位符目录下创建或删除文件或目录会导致占位符目录变得脏。

  • 完整文件/目录

    对于文件:文件的内容(主数据流)已修改。 该文件不再是提供程序存储中其状态的缓存。 在本地文件系统上创建的文件(即提供程序存储中根本不存在的文件)也被视为完整文件。

    对于目录:在本地文件系统上创建的目录(即提供程序的存储中根本不存在)被视为完整目录。 作为占位符在磁盘上创建的目录永远不会成为完整目录。

  • 墓碑

    一个特殊的隐藏占位符,表示已从本地文件系统中删除的项。 枚举目录时,ProjFS 将本地项集(占位符、完整文件等)与虚拟投影项集合并。 如果某个项同时出现在本地集和投影集中,则本地项优先。 如果本地文件系统中不存在文件,则不存在本地状态,因此它将显示在枚举中。 但是,如果该项已被删除,则使其出现在枚举中将是意外的。 将已删除的项替换为逻辑删除会导致以下效果:

    • 用于不显示项的枚举。
    • 文件打开,预期项存在失败,例如“找不到文件”。
    • 仅当项不存在成功时,文件才会创建预期成功;ProjFS 将删除逻辑删除为作的一部分。

为了说明上述状态,请考虑以下顺序,因为 ProjFS 提供程序在虚拟化根 C 中具有单个文件“foo.txt”:\root。

  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 it does not see foo.txt时。 如果尝试打开文件,则打开失败并ERROR_FILE_NOT_FOUND。