Readfile async - файлы iso c ++
-
28-10-2019 - |
Вопрос
В моем приложении на C ++ я пытаюсь читать iso-файл асинхронно с помощью createfile
- с перекрывающимся флагом, а после него - readfile
.
однако, когда я пробую этот код в простом файле (например, текстовом файле), он работает.но когда я запускаю этот код в файле iso - он терпит неудачу.
Я видел в MSDN, что сжатый файл можно читать только с помощью вызовов синхронизации readfile.находятся ли файлы iso в этой категории?
если да - есть ли у вас другие предложения, как читать iso файлы асинхронно?
это мой код:
родовое словоспасибо
Решение
Вы не опубликовали, какое значение вы используете для константы BUF_SIZE
, но убедитесь, что это целое число, кратное размеру сектора тома. Это распространенная ошибка при использовании небуферизованных файловых потоков. В документации по FILE_FLAG_NO_BUFFERING
в документации по CreateFile()
говорится:
Существуют строгие требования для успешной работы с файлами, открытыми с помощью CreateFile с помощью флага FILE_FLAG_NO_BUFFERING, подробности см. в Буферизация файлов .
Страница примечаний к буферизации файлов:
<цитата>Как обсуждалось ранее, приложение должно соответствовать определенным требованиям при работе с файлами, открытыми с помощью FILE_FLAG_NO_BUFFERING. Применяются следующие особенности:
-
Размеры доступа к файлам, включая необязательное смещение файла в структуре OVERLAPPED, если указано, должно быть для количества байтов, которое является целым числом, кратным сектору тома размер. Например, если размер сектора составляет 512 байт, приложение может запросить чтение и записывает 512, 1024, 1536 или 2048 байт, но не 335, 981 или 7171 байт.
-
Адреса буфера доступа к файлам для операций чтения и записи должны быть физическими секторами. выровнен, что означает выравнивание по адресам в памяти, которые являются целыми кратными размер физического сектора тома. В зависимости от диска это требование может не выполняться. принудительно.
Разработчикам приложений следует учитывать новые типы запоминающих устройств, представлен на рынке с размером сектора физического носителя 4096 байт.
В моей системе это значение составляет 4 КБ, и одновременное чтение всего, что меньше 4 КБ, вызывает ошибки. Во многих примерах кода Microsoft размер буфера по умолчанию составляет 1 КБ, поэтому адаптация примеров часто приводит к ошибкам с небуферизованным вводом-выводом.
Изменить : также не забудьте обнулить все элементы структуры OVERLAPPED
. Вы не устанавливаете для членов Internal
и InternalHigh
значение 0. Всегда очищайте структуру OVERLAPPED
следующим образом:
Затем вы можете установить смещение файла и дескриптор события.
Изменить : также обратите внимание на следующее примечание о параметре lpNumberOfBytesRead
на ReadFile()
:
Используйте значение NULL для этого параметра, если это асинхронная операция, чтобы избежать потенциально ошибочных результатов. [...] Дополнительную информацию см. В разделе «Примечания».
Другие советы
Я бы посоветовал обратить особое внимание на перекрывающиеся поля Offset
и OffsetHigh
, особенно при чтении файла, размер которого пересекает границу 32-битного целого числа без знака.Я считаю, что проблема, с которой вы столкнулись, кроется именно в этом.
Было бы лучше, если бы вы вызывали GetLastError (), как сказал Додо, даже если ошибки нет.То, что возвращает ReadFile, очень поможет.Что касается файлов ISO, я думаю, что это сжатые типы файлов.Однако вы можете посмотреть, как использовать функцию LzRead.Вот посмотрите на это: "
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365226%28v=vs.85%29.aspx".Вы также можете открыть файл с помощью LzOpenFile.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365225%28v=vs.85%29.aspxНадеюсь, это поможет.Не могу найти много по этой теме.