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


Функция ReadFileScatter (fileapi.h)

Считывает данные из файла и сохраняет их в массиве буферов.

Функция начинает считывание данных из файла в позиции, заданной структурой OVERLAPPED . Функция ReadFileScatter работает асинхронно.

Синтаксис

BOOL ReadFileScatter(
  [in]      HANDLE                  hFile,
  [in]      FILE_SEGMENT_ELEMENT [] aSegmentArray,
  [in]      DWORD                   nNumberOfBytesToRead,
            LPDWORD                 lpReserved,
  [in, out] LPOVERLAPPED            lpOverlapped
);

Параметры

[in] hFile

Дескриптор для считываемого файла.

Дескриптор файла должен быть создан с правой GENERIC_READ , а также флагами FILE_FLAG_OVERLAPPED и FILE_FLAG_NO_BUFFERING . Дополнительные сведения см. в разделе Безопасность файлов и права доступа.

[in] aSegmentArray

Указатель на массив FILE_SEGMENT_ELEMENT буферов структуры , получающих данные. Описание этого объединения см. в разделе Примечания.

Каждый элемент представляет одну страницу данных.

Примечание

Чтобы определить размер системной страницы, используйте GetSystemInfo.

Массив должен содержать достаточно элементов для представления байтов данных nNumberOfBytesToRead . Например, если требуется считывать 40 КБ, а размер страницы равен 4 КБ, массив должен содержать 10 элементов.

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

Функция хранит данные в буферах в последовательном порядке. Например, данные хранятся в первом буфере, затем во втором и т. д. до тех пор, пока не будет заполнен каждый буфер и все данные не будут сохранены, или пока не будут прочитаны байты nNumberOfBytesToRead .

[in] nNumberOfBytesToRead

Общее количество байтов, считываемых из файла. Каждый элемент объекта ASegmentArray содержит одностраничный блок из этого итогового значения. Так как файл должен быть открыт с FILE_FLAG_NO_BUFFERING, количество байтов должно быть кратно размеру сектора файловой системы, в которой находится файл.

lpReserved

Этот параметр зарезервирован для использования в будущем и должен иметь значение NULL.

[in, out] lpOverlapped

Указатель на структуру данных OVERLAPPED .

Для функции ReadFileScatter требуется допустимая структура OVERLAPPED . Параметр lpOverlapped не может иметь значение NULL.

Функция ReadFileScatter начинает считывание данных из файла в позиции, указанной элементами Offset и OffsetHigh структуры OVERLAPPED .

Функция ReadFileScatter может вернуться до завершения операции чтения. В этом сценарии функция ReadFileScatter возвращает значение 0 (ноль), а функция GetLastError возвращает значение ERROR_IO_PENDING. Эта асинхронная операция ReadFileScatter позволяет продолжить вызывающий процесс, пока операция чтения завершается. Для получения сведений о завершении операции чтения можно вызвать функции GetOverlappedResult, HasOverlappedIoCompleted или GetQueuedCompletionStatus . Дополнительные сведения см. в разделе Синхронный и асинхронный ввод-вывод.

Возвращаемое значение

Если функция выполняется успешно, возвращается ненулевое значение.

Если функция завершается сбоем, возвращаемое значение равно нулю (0). Чтобы получить расширенные сведения об ошибке, вызовите функцию GetLastError .

Если ReadFileScatter пытается выполнить чтение после окончания файла (EOF), вызов Метода GetOverlappedResult для этой операции возвращает значение FALSE , а GetLastError возвращает ERROR_HANDLE_EOF.

Если функция возвращается до завершения операции чтения, функция возвращает ноль (0), а GetLastError возвращает ERROR_IO_PENDING.

Комментарии

Эта функция не поддерживается для 32-разрядных приложений WOW64 в системах на основе Itanium.

Структура FILE_SEGMENT_ELEMENT определяется следующим образом:

typedef union _FILE_SEGMENT_ELEMENT {
    PVOID64 Buffer;
    ULONGLONG Alignment;
}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;

При назначении указателя на элемент Buffer значение будет расширяться, если код компилируется как 32-разрядный; это может нарушить работу приложений с поддержкой больших адресов, работающих в системах, настроенных с настройкой 4 Гигабайт или работающих в WOW64 в 64-разрядной версии Windows. Поэтому используйте макрос PtrToPtr64 при назначении указателей буферу.

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

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

Транзакция операций

Если к дескриптору файла привязана транзакция, функция возвращает данные из представления файла с транзакцией. Дескриптор чтения с транзакцией гарантированно отображает одно и то же представление файла на протяжении всего дескриптора.

Требования

   
Минимальная версия клиента Windows XP [только классические приложения]
Минимальная версия сервера Windows Server 2003 [только классические приложения]
Целевая платформа Windows
Header fileapi.h (включая Windows.h)
Библиотека Kernel32.lib
DLL Kernel32.dll

См. также

CreateFile

FILE_SEGMENT_ELEMENT

Функции управления файлами

GetOverlappedResult

GetQueuedCompletionStatus

HasOverlappedIoCompleted

ПЕРЕКРЫВАЮЩИХСЯ

ReadFile

ReadFileEx

WriteFileGather