Я тестировал функцию NtReadFile()
на моем Win7 против тома NTFS и заметил, что в следующем коде (дескриптор был открыт с флагом FILE_SYNCHRONOUS_IO_NONALERT
):
IO_STATUS_BLOCK io;
NTSTATUS r = NtReadFile(h, NULL, NULL, NULL, &io, buf, buf_size, &pos, NULL);
io.Information
(который должен содержать количество полученных байтов) заполняется, только если r == STATUS_SUCCESS
. Если r == STATUS_END_OF_FILE
io.Information содержит исходный мусор и (кажется) данные не были прочитаны в этом вызове.
Итак, могу ли я предположить, что если r == STATUS_SUCCESS
и io.Information < buf_size
- мы достигли конца файл? Или мне продолжать звонить NtReadFile
, пока он не вернет STATUS_END_OF_FILE
? (т.е. возможно короткое чтение).
С одной стороны, Microsoft утверждает короткие чтения невозможны:
NtReadFile ... завершает операцию чтения под одно из следующих условий:
- Буфер заполнен, так как было прочитано количество байтов, указанное параметром Length. Следовательно, данные в буфер нельзя помещать без переполнения.
- Достигнут конец файла во время операции чтения, поэтому в файле больше нет данных для передачи в буфер.
... и я хотел бы избежать ненужного звонка NtReadFile
. С другой стороны, мой опыт подсказывает, что никогда нельзя доверять Microsoft на 100%.