Вы не указали, какое значение вы используете для константы BUF_SIZE
, но убедитесь, что это целое число, кратное размеру сектора тома.Это распространенная ошибка при использовании небуферизованных файловых потоков.Документация для FILE_FLAG_NO_BUFFERING
в документации CreateFile()
гласит:
Существуют строгие требования для успешной работы с файлами, открытыми в CreateFile с использованием флага FILE_FLAG_NO_BUFFERING, подробности см. Буферизация файлов .
Страница примечаний по буферизации файлов:
Как обсуждалось ранее, приложение должно соответствовать определенным требованиям при работе с файлами, открытыми с помощью FILE_FLAG_NO_BUFFERING,Применяются следующие особенности:
Размеры доступа к файлу, включая необязательное смещение файла в структуре OVERLAPPED, если оно указано, должны соответствовать числу байтов, кратному целому числу сектора томаразмер.Например, если размер сектора составляет 512 байт, приложение может запросить чтение и запись в 512, 1024, 1536 или 2048 байт, но не в 335, 981 или 7 171 байт.
Адреса буфера доступа к файлу для операций чтения и записи должны быть выровнены по физическому сектору, что означает выравнивание по адресам в памяти, которые являются целыми числами, кратными размеру физического сектора тома.В зависимости от диска это требование может не выполняться.
Разработчики приложений должны принять к сведению новые типы устройств хранения данных, представленных на рынке, с размером сектора физических носителей, равным4,096 байт.
В моей системе это значение равно 4 КБ, и чтение всего, что меньше 4 КБ, приводит к ошибкам.Во многих примерах кода Microsoft 1K является размером буфера по умолчанию, поэтому адаптация примеров часто приводит к ошибкам с небуферизованным вводом / выводом.
Edit : также убедитесь, что обнулили все членыструктура OVERLAPPED
.Вы не устанавливаете элементы Internal
и InternalHigh
в 0. Всегда очищайте структуру OVERLAPPED
следующим образом:
OVERLAPPED overlapped;
ZeroMemory(&overlapped, sizeof(OVERLAPPED));
Затем вы можете установить смещение файла и дескриптор события.
Редактировать : также учтите следующее примечание о параметре lpNumberOfBytesRead
для ReadFile()
:
Используйте NULL для этого параметраесли это асинхронная операция, чтобы избежать потенциально ошибочных результатов.[...] Подробнее см. В разделе «Примечания».