Разреженные операции с файлами
Чтобы определить, поддерживает ли файловая система разреженные файлы, вызовите функцию 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 на экстенты дисков до использования доступного пространства.