Поделиться через


FSCTL_QUERY_ALLOCATED_RANGES IOCTL (winioctl.h)

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

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

BOOL DeviceIoControl(
  (HANDLE) hDevice,                 // handle to file
  FSCTL_QUERY_ALLOCATED_RANGES,     // dwIoControlCode
  (LPVOID) lpInBuffer,              // input buffer
  (DWORD) nInBufferSize,            // size of input buffer
  (LPVOID) lpOutBuffer,             // output buffer
  (DWORD) nOutBufferSize,           // size of output buffer
  (LPDWORD) lpBytesReturned,        // number of bytes returned
  (LPOVERLAPPED) lpOverlapped       // OVERLAPPED structure
);

Комментарии

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

Файловая система NTFS округляет смещение входного файла до удобной границы и длины до удобной границы, а затем начинает обход файла.

Операционная система не отслеживает все нулевые (0) или ненулевые данные. Поскольку ноль (0) часто является совершенно законным datum, это будет вводить в заблуждение. Вместо этого система отслеживает диапазоны, в которых выделяется место на диске. Если место на диске не выделено, предполагается, что все данные равны нулю (0). Выделенное хранилище может содержать ноль (0) или ненулевое значение. Поэтому вся эта операция возвращает сведения о частях файла, где могут находиться ненулевое данные. Приложение может сканировать эти части файла в соответствии с соглашениями о данных приложения.

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

Выделенные диапазоны подчиняются правилу, согласно которому сопоставленный в памяти удаленный (сетевой) файл и открытый дескриптор с файлом не обязательно являются согласованными. Если память сопоставила разреженный сетевой файл и записала ненулевые данные в ранее нераспределенные области файла, место на диске будет выделено для новых данных. Однако последующий вызов FSCTL_QUERY_ALLOCATED_RANGES не обязательно вернет правильный список выделенных регионов. Чтобы обеспечить согласованность между памятью представления и дескриптором файла, зачистите данные в файл с помощью функции FlushViewOfFile .

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

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

Требования

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

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