Вопрос

В моем приложении на 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
Надеюсь, это поможет.Не могу найти много по этой теме.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top