Управляющий код FSCTL_QUERY_ALLOCATED_RANGES просматривает файл или область поиска выбранного потока, которые могут содержать данные отличные от нуля. Только сжатый или разреженный файлы могут иметь обнуленные области, о которых знает операционная система. Для других файлов, буфер вывода данных будет содержать только единственную запись, которая содержит отправную точку и затребованную длину.
Чтобы выполнить эту операцию, вызовите функцию DeviceIoControl со следующими параметрами.
BOOL DeviceIoControl( (HANDLE) hDevice, // дескриптор устройства FSCTL_QUERY_ALLOCATED_RANGES, // dwIoControlCode (LPVOID) lpInBuffer, // буфер ввода (DWORD) nInBufferSize, // размер буфера ввода (LPVOID) lpOutBuffer, // буфер вывода (DWORD) nOutBufferSize, // размер буфер вывода (LPDWORD) lpBytesReturned, // число возвращаемых байтов (LPOVERLAPPED) lpOverlapped // структура OVERLAPPED ); |
hDevice
[in] Дескриптор файла или выбранного потока, в которых запрашиваются распределенные области. Чтобы извлечь дескриптор, используйте функцию CreateFile.dwIoControlCode
[in] Управляющий код для операции. Для этой операции используйте FSCTL_QUERY_ALLOCATED_RANGES.lpInBuffer
[in] Указатель на структуру FILE_ALLOCATED_RANGE_BUFFER, которая указывает часть файла, где искать распределенные области. Член структуры FleOffset обозначает смещение, в байтах, до первого байта области, в которой искать, а член структуры Length указывает ее размер, в байтах.nInBufferSize
[in] Размер буфера lpInBuffer, в байтах.lpOutBuffer
[out] Указатель на буфер, который принимает массив структур FILE_ALLOCATED_RANGE_BUFFER. Каждая структура в массиве предоставляет информацию о распределенной области внутри файла. Член FileOffset каждой структуры обозначает начало области, а член структуры Length указывает ее размер, в байтах.Возвращенные области - всегда, по крайней мере, в пределах области, определенной в буфере lpInBuffer.
nOutBufferSize
[in] Размер буфера lpOutBuffer, в байтах.lpBytesReturned
[out] Указатель на переменную, которая получает размер данных, сохраненных в буфере вывода данных, в байтах.Если буфер вывода данных является слишком маленьким для любых данных, то вызов завершается ошибкой, GetLastError возвращает код ошибки ERROR_INSUFFICIENT_BUFFER, а итоговое число возвращаемых байт равняется нулю.
Если буфер вывода данных
является слишком маленьким, чтобы вместить
все данные, но может вместить некоторые
введенные данные, то некоторые драйверы
возвратят столько данных сколько их
вместилось. В этом случае,
вызов завершается ошибкой, GetLastError
возвращает код ошибки ERROR_MORE_DATA,
а lpBytesReturned указывает объем
возвращенных данных. Ваше приложение
должно снова вызывать DeviceIoControl для
одной и той же операции, определяя новую
начальную точку.
Если параметр lpOverlapped
- ПУСТО (NULL), lpBytesReturned не может быть
ПУСТО (NULL). Даже тогда, когда операция не
возвращает никакого вывода данных, а
параметр lpOutBuffer - ПУСТО (NULL), функция DeviceIoControl
использует lpBytesReturned. После такой
операции, значение параметра lpBytesReturned
становится бессмысленным. Если параметр lpOverlapped
- не ПУСТО (NULL), то - lpBytesReturned может
быть ПУСТО (NULL). Если этот параметр - не ПУСТО
(NULL) и операция возвращает данные, lpBytesReturned
не имеет смысла до тех пор, пока не
завершиться асинхронная операция. Чтобы
получить данные о числе возвращаемых
данных, вызовите функцию GetOverlappedResult.
Если параметр hDevice связан с
портом завершения ввода-вывода данных (I/O),
Вы можете извлечь число возвращаемых
данных при помощи вызова функции GetQueuedCompletionStatus.
lpOverlapped
[in] Указатель на структуру OVERLAPPED.Если параметр hDevice открывался без установки флажка FILE_FLAG_OVERLAPPED, параметр lpOverlapped игнорируется.
Если параметр hDevice открывался с флажком FILE_FLAG_OVERLAPPED, операция выполняется как перекрывающая (асинхронная) операция. В этом случае, параметр lpOverlapped должен указать на допустимую структуру OVERLAPPED, которая содержит дескриптор объекта события. Иначе, функция завершается ошибкой непредсказуемыми способами.
Для асинхронных операций, функция DeviceIoControl возвращает значение немедленно, а объект события подает сигнал, когда операция завершается. В противном случае, функция не возвращает значение до тех пор, пока операция не завершится или не произойдет ошибка.
Если операция завершается успешно, функция DeviceIoControl возвращает не нулевое значение, а буфер вывода данных, на который указывает параметр lpOutBuffer содержит массив допустимых структур FILE_ALLOCATED_RANGE_BUFFER.
Если операция завершается ошибкой, DeviceIoControl возвращает нуль. Содержание буфера вывода данных, на который указывает lpOutBuffer не имеет смысла. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError.
Как включить асинхронный ввод-вывод в эту операцию, см. раздел Замечаний в описании функции DeviceIoControl.
NTFS округляет введенное смещение файла вниз , а длину вверх до подходящей границы, и затем начинает обход всего файла.
Операционная система не отслеживает каждый кусочек нулевых или ненулевых данных. Поскольку нуль - часто совершенно допустимая данная величина, он будет вводить в заблуждение. Вместо этого, система отслеживает области, куда распределяется дисковое пространство. Куда дисковое пространство не распределяется, все принятые данные будут нулевыми. Назначенное хранилище данных может содержать нулевые или ненулевые данные. Так что вся эта операция возвращает информацию о частях файла, где могут быть расположены ненулевые данные. Эти данные передаются прикладной программе, чтобы просматривать эти части файла в соответствии с соглашениями о представлении данных в приложении.
Каждая запись в массиве вывода данных содержит смещение и длину, указывающие область в файле, которая может содержать ненулевые данные. Фактические отличные от нуля данные, если таковые вообще имеются, находятся где-нибудь, внутри этой области и вызывающая программа должны искать далее внутри области, чтобы определить местонахождение их и выяснить, является ли они действительно допустимыми данными. Внутри области могут существовать несколько экземпляров допустимых данных.
Распределенные области подчиняются правилу, по которому удаленный (сетевой) отображаемый в памяти файл и открытый дескриптор файла не обязательно связаны. Если Вы отобразили в памяти разреженный сетевой файл и записали ненулевые данные в предварительно не распределенных областях файла, дисковое пространство будет распределено под новые данные. К тому же, вызов FSCTL_QUERY_ALLOCATED_RANGES после этого не обязательно возвратит правильный список распределенных областей. Чтобы гарантировать связь между видимой памятью и дескриптором файла, сбросьте данные в файл при помощи функции FlushViewOfFile.
Разреженные файлы, Управляющие коды, используемые в управлении файлами, DeviceIoControl, FILE_ALLOCATED_RANGE_BUFFER, FSCTL_SET_SPARSE, FSCTL_SET_ZERO_DATA
Размещение и совместимость FSCTL_QUERY_ALLOCATED_RANGES |
||
К |
Windows XP |
Да |
л |
Windows 2000 Professional |
Да |
и |
Windows NT |
Нет |
е |
Windows Me |
Нет |
н |
Windows 98 |
Нет |
т |
Windows 95 |
Нет |
С |
Windows Server 2003 |
Да |
е | Windows 2000 Server | Да |
р | Windows NT Server | Нет |
в | ||
е | ||
р | ||
Используемая библиотека |
- |
|
Используемая DLL | - | |
Заголовочный файл | ||
- объявлено в |
Winioctl.h |
|
- включено в |
- |
|
Unicode |
Нет |
|
Замечания по платформе |
Не имеется |