Количество байтов, прочитанных синхронным файлом ReadFile - PullRequest
4 голосов
/ 27 июля 2010

Предположим, у меня есть файл 1Mb, указатель файла находится в начале файла.Я вызываю синхронный ReadFile:

ReadFile(Handle, Buffer, 1024, Result, nil);

звонок успешен, ошибки не произошло.Возможно ли, что значение Result (количество прочитанных байтов) меньше 1024 (количество читаемых байтов)?

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


Чтобы избежать философских рассуждений, я могу переформулировать вопрос следующим образом:выполняется без ошибок, а количество прочитанных байтов меньше количества прочитанных.Могу ли я быть уверен, что EOF достигнут?

Ответы [ 2 ]

4 голосов
/ 27 июля 2010

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

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

Например, Readfile может вернуть 0 байтовчитать успешный вызов, когда другой конец именованного канала называется WriteFile с 0 байтами для записи ...

0 голосов
/ 26 июня 2015

MSDN, кажется, говорит только следующее w.r.t. когда ReadFile возвращает меньше, чем запрошенное число байтов для файла (то есть не сокет, канал и т. д.): https://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx

Когда синхронная операция чтения достигает конца файла, ReadFile возвращает TRUE и устанавливает * lpNumberOfBytesRead в ноль.

Я не могу найти никаких доказательств или опровержения того, что ReadFile не будет читать меньший фрагмент файла и возвращать размер этого фрагмента, если файл содержит не менее первоначально запрошенного количества байтов. Таким образом, я пишу код, который проверяет, сколько байтов возвращает ReadFile, и снова вызывает ReadFile (в цикле), пока общее количество возвращаемых байтов меньше, чем запрошенное количество байтов, если ReadFile не возвращает 0 байтов, что означает EOF в соответствии с MSDN.

Практическое значение:

  1. вызов GetFileSizeEx и выделение буфера размера, сообщенного этим функция
  2. вызов ReadFile, запрашивающий чтение всего буфера сразу
  3. программист не может полагаться, что ReadFile не будет читать меньший чанк, сообщающий об этом количестве прочитанных байтов
...