Операции с разреженным файлом

Чтобы определить, поддерживает ли файловая система разреженные файлы, вызовите функцию GetVolumeInformation и проверьте флаг бита FILE_SUPPORTS_SPARSE_FILES , возвращаемый с помощью параметра lpFileSystemFlags .

Большинство приложений не знают о разреженных файлах и не создают разреженные файлы. Тот факт, что приложение считывает разреженный файл, прозрачен для приложения. Приложение, которое знает о разреженных файлах, должно определить, подходит ли его набор данных для хранения в разреженном файле. После этого приложение должно явно объявить файл как разреженный, используя код FSCTL_SET_SPARSE управления.

После того как приложение настроит файл как разреженный, приложение может использовать управляющий код FSCTL_SET_ZERO_DATA , чтобы задать область файла равным нулю. Кроме того, приложение может использовать управляющий код FSCTL_QUERY_ALLOCATED_RANGES для ускорения поиска ненулевых данных в разреженном файле.

При выполнении операции записи (с функцией или операцией, отличной от FSCTL_SET_ZERO_DATA), данные которой состоят только из нулей, нули записываются на диск в течение всей длины записи. Чтобы обнулить диапазон файла и сохранить разреженность, используйте FSCTL_SET_ZERO_DATA.

Приложение, поддерживающее разреженность, также может задать разреженный файл. Если приложение устанавливает существующий файл как разреженный, оно должно сканировать файл на наличие областей, содержащих нули, и использовать FSCTL_SET_ZERO_DATA для сброса этих регионов, что может привести к освобождению физического дискового хранилища. Приложение, обновленное до разреженных файлов, должно выполнять это преобразование.

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

Как и в случае с любым другим файлом, система может записывать данные в разреженный файл или считывать их из любой позиции. Запись ненулевых данных в ранее обнуляемую часть файла может привести к выделению места на диске. Нули, записываемые по ненулевым данным (только с FSCTL_SET_ZERO_DATA), могут привести к освобождению места на диске.

Примечание

Приложение может поддерживать разреженность, записывая нули с FSCTL_SET_ZERO_DATA.

 

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