Вы можете выяснить, поддерживает ли файловая система разреженные файлы при помощи вызова функции GetVolumeInformation и проверки бита флажка FILE_SUPPORTS_SPARSE_FILES.
Большинство приложений не знает о разреженных файлах и не будет создавать их. Факт того, что приложение читает разреженный файл, незаметен для прикладной программы. Приложение, которое знает о разреженных файлах, должно выяснить, является ли его набор данных подходящим, чтобы быть сохраненным в разреженном файле. После того, как это определение сделано, приложение должно явно объявить файл как разреженный, используя управляющий код 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.