Состояние кэша в корневом каталоге виртуализации
Поставщик использует локальную файловую систему в корневом каталоге виртуализации в качестве кэша элементов, управляемых им. Элемент (файл или каталог) может находиться в одном из шести состояний в локальной файловой системе:
Виртуальный
Элемент не существует локально на диске. Он проецируется, т. е. синтезируется во время перечисления родительского каталога. Виртуальные элементы объединяются с любыми элементами, которые могут существовать на диске, чтобы представить полное содержимое родительского каталога.
Заполнитель
Для файлов: содержимое файла (основной поток данных) отсутствует на диске. Метаданные файла (имя, размер, метки времени, атрибуты и т. д.) кэшируются на диске.
Для каталогов: некоторые или все непосредственные потомки каталога (файлы и каталоги в каталоге) не присутствуют на диске, т. е. они по-прежнему виртуальны. Метаданные каталога (имя, метки времени, атрибуты и т. д.) кэшируются на диске.
Гидратированный заполнитель
Для файлов: содержимое и метаданные файла кэшированы на диск. Также называется частичным файлом.
Для каталогов: каталог, созданный на диске в качестве заполнителя, никогда не становится гидратированным каталогом заполнителей. Это позволяет поставщику добавлять или удалять элементы из каталога в резервном хранилище и отражать эти изменения в локальном кэше.
Грязный заполнитель (гидратированный или нет)
Метаданные элемента были локально изменены и больше не кэш его состояния в хранилище поставщика. Обратите внимание, что создание или удаление файла или каталога в каталоге заполнителей приводит к тому, что каталог заполнителей становится грязным.
Полный файл или каталог
Для файлов: содержимое файла (основной поток данных) было изменено. Файл больше не является кэшем своего состояния в хранилище поставщика. Файлы, созданные в локальной файловой системе (т. е. отсутствуют в хранилище поставщика) также считаются полными файлами.
Для каталогов: каталоги, созданные в локальной файловой системе (т. е. которые не существуют в хранилище поставщика вообще) считаются полными каталогами. Каталог, созданный на диске в качестве заполнителя, никогда не становится полным каталогом.
Памятник
Специальный скрытый заполнитель, представляющий элемент, удаленный из локальной файловой системы. При перечислении каталога ProjFS объединяет набор локальных элементов (заполнителей, полных файлов и т. д.) с набором виртуальных проецируемых элементов. Если элемент отображается как в локальных, так и прогнозируемых наборах, локальный элемент имеет приоритет. Если файл не существует в локальной файловой системе, отсутствует локальное состояние, поэтому он будет отображаться в перечислении. Однако если этот элемент был удален, его появление в перечислении будет неожиданным. Замена удаленного элемента на могилу приводит к следующим последствиям:
- Перечисления, не раскрывающие элемент.
- Откроется файл, ожидающий сбоя элемента, например "файл не найден".
- Файл создает, ожидающее успешного выполнения, только если элемент не существует успешно; ProjFS удаляет камень в рамках операции.
Чтобы проиллюстрировать приведенные выше состояния, рассмотрим следующую последовательность, учитывая поставщик ProjFS, имеющий один файл "foo.txt", расположенный в корневом каталоге виртуализации C:\root.
- Приложение перечисляет 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.