Состояние кэша в корне виртуализации

Поставщик использует локальную файловую систему в корневом каталоге виртуализации в качестве кэша элементов, которыми он управляет. Элемент (файл или каталог) может находиться в одном из шести состояний локальной файловой системы:

  • Виртуальная

    Элемент не существует локально на диске. Он проецируется, т. е. синтезируется, во время перечисления родительского каталога. Виртуальные элементы объединяются со всеми элементами, которые могут существовать на диске для представления полного содержимого родительского каталога.

  • Заполнитель

    Для файлов: содержимое файла (основной поток данных) отсутствует на диске. Метаданные файла (имя, размер, метки времени, атрибуты и т. д.) кэшируются на диске.

    Для каталогов. Некоторые или все непосредственные потомки каталога (файлы и каталоги в каталоге) отсутствуют на диске, т. е. они по-прежнему являются виртуальными. Метаданные каталога (имя, метки времени, атрибуты и т. д.) кэшируются на диске.

  • Гидратированный заполнитель

    Для файлов: содержимое и метаданные файла были кэшированы на диск. Также называется частичным файлом.

    Для каталогов: каталог, созданный на диске в качестве заполнителя, никогда не становится гидратированным каталогом-заполнителем. Это позволяет поставщику добавлять или удалять элементы из каталога в его резервном хранилище и отражать эти изменения в локальном кэше.

  • Грязный заполнитель (гидратированный или нет)

    Метаданные элемента были локально изменены и больше не являются кэшем его состояния в хранилище поставщика. Обратите внимание, что при создании или удалении файла или каталога в каталоге-заполнителе этот каталог становится грязное.

  • Полный файл или каталог

    Для файлов: содержимое файла (основной поток данных) было изменено. Файл больше не является кэшем своего состояния в хранилище поставщика. Файлы, созданные в локальной файловой системе (т. е. не существующие в хранилище поставщика), также считаются полными файлами.

    Для каталогов: каталоги, созданные в локальной файловой системе (т. е. не существующие в хранилище поставщика), считаются полными каталогами. Каталог, созданный на диске в качестве заполнителя, никогда не становится полным каталогом.

  • Захоронения

    Специальный скрытый заполнитель, представляющий элемент, удаленный из локальной файловой системы. При перечислении каталога ProjFS объединяет набор локальных элементов (заполнителей, полных файлов и т. д.) с набором виртуальных проецируемых элементов. Если элемент отображается как в локальном, так и в проецируемых наборах, приоритет имеет локальный элемент. Если файл не существует в локальной файловой системе, локальное состояние отсутствует, поэтому он будет отображаться в перечислении . Однако если этот элемент был удален, его появление в перечислении было бы неожиданным. Замена удаленного элемента надгробием приводит к следующим последствиям:

    • Перечисления, не раскрывающие элемент.
    • При открытии файла, ожидающего существования элемента, происходит сбой, например "файл не найден".
    • Создает файл, который ожидается успешно, только если элемент не существует успешно; ProjFS удаляет надгробие в рамках операции.

Чтобы проиллюстрировать приведенные выше состояния, рассмотрим следующую последовательность, учитывая поставщик ProjFS с одним файлом "foo.txt", расположенным в корневом каталоге виртуализации C:\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, оно не видит foo.txt. Если он пытается открыть файл, открытие завершается сбоем с ERROR_FILE_NOT_FOUND.