Поделиться через


код элемента управления FSCTL_FILE_LEVEL_TRIM

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

Чтобы выполнить эту операцию, вызовите FltFsControlFile или ZwFsControlFile со следующими параметрами.

Параметры

  • Экземпляр [in]: только FltFsControlFile . Указатель непрозрачного экземпляра для вызывающего объекта. Этот параметр является обязательным и не может иметь значение NULL.

  • FileObject [in]: только FltFsControlFile . Указатель объекта файла на файл, который содержит данные для обрезки. Этот параметр является обязательным и не может иметь значение NULL.

  • FileHandle [in]: только ZwFsControlFile . Дескриптор файла, который содержит данные для обрезки. Этот параметр является обязательным и не может иметь значение NULL.

  • FsControlCode [in]: код управления для операции. Используйте FSCTL_FILE_LEVEL_TRIM для этой операции.

  • InputBuffer [in]: указатель на FILE_LEVEL_TRIM структуру, содержащую массив диапазонов обрезки для файла.

  • InputBufferLength [in]: размер в байтах буфера, на который указывает параметр InputBuffer . Это значение должно быть по крайней мере sizeof(FILE_LEVEL_TRIM).

  • OutputBuffer [out]: указатель на необязательную FILE_LEVEL_TRIM_OUTPUT структуру, которая получает результат операции обрезки.

  • OutputBufferLength [out]: размер буфера в байтах, на который указывает параметр OutputBuffer . Это значение должно быть по крайней мере sizeof(FILE_LEVEL_TRIM_OUTPUT), если FILE_LEVEL_TRIM_OUTPUT включен в OutputBuffer. В противном случае это значение равно 0.

Блок состояния

FltFsControlFile или ZwFsControlFile возвращает STATUS_SUCCESS или, возможно, одно из следующих значений.

Код Значение
STATUS_INVALID_PARAMETER Файл для обрезки сжимается или шифруется, длина входного или выходного буфера недопустима или не указана.
STATUS_INSUFFICIENT_RESOURCES Сбой выделения внутренних ресурсов.
STATUS_FILE_LOCK_CONFLICT Диапазон обрезки является частью ранее заблокированного диапазона байтов.
STATUS_VOLUME_DISMOUNTED Том, в котором находится файл, не подключен.
STATUS_PURGE_FAILED Сбой очистки кэша для диапазона обрезки.
STATUS_NO_RANGES_PROCESSED Диапазоны в массиве обрезки не обрабатываются.

Замечания

Выполнение обрезки на определенных устройствах хранения может значительно повысить производительность записи в будущем. Обрезка также возвращает ресурсы в пул распределения в системах хранения, которые тонко подготовлены. Если файлы удаляются на виртуальном диске, размер самого файла виртуального диска не изменяется. Диапазоны данных, освобожденные на виртуальном диске, не обрезаются в физическом хранилище, где находится файл виртуального диска. Устройство виртуального диска может уведомить файловую систему о том, что определенные диапазоны данных в файле виртуального диска можно обрезать на физическом устройстве хранилища с помощью запроса FSCTL_FILE_LEVEL_TRIM . Затем файловая система выдает запрос обрезки физическому хранилищу. Запрос FSCTL_FILE_LEVEL_TRIM также может быть выдан приложениями-службами, которые управляют файлами базы данных или буферов памяти.

Код элемента управления FSCTL_FILE_LEVEL_TRIM попытается обрезать выбранные диапазоны байтов файла с устройства хранения. Диапазоны байтов содержатся в массиве Ranges в структуре FILE_LEVEL_TRIM . В массив ranges входит одна или несколько структур FILE_LEVEL_TRIM_RANGE.

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

Обрезанные диапазоны очищаются как страницы из кэша файловой системы. Чтобы соответствовать размеру страницы кэша, длина диапазона обрезки корректируется до нескольких PAGE_SIZE. Кроме того, если смещение диапазона обрезки не начинается с границы страницы, оно выравнивается на следующую границу страницы. При использовании этих ограничений длина диапазона обрезки уменьшается, если их смещения не выровнены по страницам или длина страницы не являются несколькими размерами страницы. Длина диапазона обрезки может уменьшиться до 0, если исходная длина меньше двух страниц, а смещение не выровнено.

Если задан диапазон обрезки или страница, отрегулированная за пределами конечного файла (EOF), диапазон игнорируется. Однако смещение диапазона выравнивается до EOF, но длина, расширяющаяся до EOF, будет скорректирована на размер страницы несколько <= EOF.

Обрезка уровня файлов не поддерживается для сжатых или зашифрованных файлов (файлы с набором атрибутов ATTRIBUTE_FLAG_COMPRESSION_MASK или ATTRIBUTE_FLAG_ENCRYPTED ).

Обрезка файла выполняется за пределами любой транзакции. Откат операции обрезки невозможен.

С разреженными файлами (файлами с набором атрибутов ATTRIBUTE_FLAG_SPARSE ), диапазон обрезки в нераспределенной части файла игнорируется.

При включении в OutputBuffer член NumRangesProcessed FILE_LEVEL_TRIM_OUTPUT указывает количество успешно обработанных диапазонов обрезки. Если во время обработки диапазонов обрезки возникает ошибка, NumRangesProcessed укажет начальный индекс оставшихся необработанных диапазонов, заканчивая элементом NumRanges FILE_LEVEL_TRIM – 1.

Требования

Тип требования Требование
Минимальная версия клиента Windows 8
Верхний колонтитул Ntifs.h (включая Ntifs.h или Fltkernel.h)

См. также

FILE_LEVEL_TRIM

FILE_LEVEL_TRIM_OUTPUT

FILE_LEVEL_TRIM_RANGE

FltCreateFile

FltFsControlFile

ZwCreateFile

ZwFsControlFile