Таким образом можно создавать файлы гигантского размера, состоящие из нулей, но на диске они могут занимать всего лишь несколько килобайт. Реальное дисковое пространство выделяется тогда, когда вместо 0x00 записываются какие-то другие данные. Разреженность поможет сэкономить дисковое пространство только в таких файлах, в которых есть действительно большие пустые области.
Демонстрировать работу с разреженными файлами я буду с помощью системной утилиты fsutil в командной строке.
Создадим с помощью утилиты пустой файл большого размера:
fsutil file createnew test.nul 10000000000Присвоим файлу атрибут «sparse»:
fsutil sparse setflag test.nulСам по себе атрибут ещё не приводит к экономии дискового пространства. Нужно ещё разметить внутри файла область, которая будет освобождена. У нас весь файл пустой, так что область можно задать в размер файла.
fsutil sparse setrange test.nul 0 10000000000Готово. Смотрим результат.

Как проделывать эти операции в своих программах с помощью API функций, можете посмотреть в исходном коде небольшой утилиты, которую я написал в 2006-м. Она тоже консольная, и тоже как fsutil умеет присваивать атрибут sparse и задавать диапазон освобождаемой области. Кроме того, моя программка может сама искать в файле пустые области больше некоторого заданного размера и освобождать их. Отпадает необходимость самому вычислять смещения.
Ссылки:

