FSCTL_SET_SPARSE IOCTL (winioctl.h)

Помечает указанный файл как разреженный или не разреженный. В разреженном файле для больших диапазонов нулей может не потребоваться выделение диска. Пространство для ненулевых данных будет выделено по мере необходимости при записи файла.

Для выполнения этой операции вызовите функцию DeviceIoControl со следующими параметрами.

BOOL DeviceIoControl(
  (HANDLE) hDevice,                         // handle to a file
  FSCTL_SET_SPARSE,                         // dwIoControlCode
  (PFILE_SET_SPARSE_BUFFER) lpInBuffer,     // input buffer
  (DWORD) nInBufferSize,                    // size of input buffer
  NULL,                                     // lpOutBuffer
  0,                                        // nOutBufferSize
  (LPDWORD) lpBytesReturned,                // number of bytes returned
  (LPOVERLAPPED) lpOverlapped               // OVERLAPPED structure
);

Комментарии

Сведения о последствиях перекрывающихся операций ввода-вывода для этой операции см. в разделе Примечания статьи DeviceIoControl.

Код элемента управления FSCTL_SET_SPARSE задает или очищает атрибут FILE_ATTRIBUTE_SPARSE_FILE указанного файла.

Windows Server 2008 R2, Windows 7, Windows Server 2008 и Windows Vista: Операция очистки действительна только для файлов, которые больше не имеют разреженных областей. Выполнение четкой операции с файлом с разреженными областями может иметь непредсказуемые результаты. Определить, есть ли в файле какие-либо разреженные области, можно с помощью кода элемента управления FSCTL_QUERY_ALLOCATED_RANGES .

Если параметр lpInBuffer имеет значение NULL, операция будет вести себя так же, как если бы элемент SetSparseструктуры FILE_SET_SPARSE_BUFFER был true. Другими словами, операция задает для файла разреженный файл.

Windows Server 2003 и Windows XP: Если структура FILE_SET_SPARSE_BUFFER передается в параметре lpInBuffer , единственным допустимым значением для элемента SetSparse является TRUE, которое задает для файла разреженный файл. Передача false в структуре FILE_SET_SPARSE_BUFFER приведет к сбою вызова функции. Единственный способ очистить этот атрибут — перезаписать файл (например, вызвав функцию CreateFile с флагом CREATE_ALWAYS ).

Вы не можете создать разреженный файл, вызвав CreateFile с FILE_ATTRIBUTE_SPARSE_FILE в параметре dwFlagsAndAttributes . Необходимо использовать код элемента управления FSCTL_SET_SPARSE .

Обратите внимание, что метки времени могут быть обновлены неправильно для удаленного файла. Чтобы обеспечить согласованность результатов, используйте небуферированные ввод-вывод.

В Windows 8 и Windows Server 2012 этот код поддерживается следующими технологиями.

Технология Поддерживается
Протокол SMB 3.0 Да
Прозрачная отработка отказа (TFO) SMB 3.0 Да
SMB 3.0 с масштабируемыми общими папками (SO) Да
Файловая система общего тома кластера (CSVFS) См. примечания
Восстанавливаемая файловая система (ReFS) Да

CsvFs будет выполнять перенаправление операций ввода-вывода для разреженных файлов. CsvFs позволяет делать файлы разреженными, только если файл открывается исключительно узлом. Прозрачная отработка отказа SMB 3.0 не поддерживает буферизацию записи.

Требования

   
Минимальная версия клиента Windows XP [только классические приложения]
Минимальная версия сервера Windows Server 2003 [только классические приложения]
Верхняя часть winioctl.h (включая Windows.h)

См. также раздел