См. Это обсуждение буферизации файлов в MSDN.
Открытие файла с флагом CFile::osNoBuffer
или передача флага FILE_FLAG_NO_BUFFERING
на CreateFile
- это совершенно особый способ записи в файл. Это требует, чтобы все буферы, которые вы используете для записи в файл, были выровнены по границе сектора в памяти, а также чтобы вы записали только целое число, кратное размеру сектора. Если вы не предприняли специальных шагов для выравнивания буфера, который вы передаете (чего у вас здесь нет), а также написаны, по крайней мере, например. 512 байт, маловероятно, что он будет работать, если устройство не будет игнорировать ваш флаг. Я думаю, что вы, возможно, не заметили, что WriteFile
вернул код ошибки вместо того, чтобы выдавать исключение.
Я бы спросил: почему вы вообще указываете этот флаг? Его использование довольно специализировано, и если вы просто выполняете обычный повседневный файловый ввод-вывод, например, пишете текстовый файл, то вам следует , а не , указать этот флаг. Это, вероятно, замедляет вашу программу, а также делает ее более сложной. Я также рекомендую удалить CFile::osWriteThrough
.
Точно так же, как вы знаете: использование FILE_FLAG_NO_BUFFERING
почти исключительно для вещей, записывающих огромное количество данных, которые должны поступать непосредственно на диск, таких как приложения для регистрации данных в реальном времени или записи видео. FILE_FLAG_WRITE_THROUGH
используется для таких вещей, как файлы журнала базы данных, которые должны сбрасываться после каждой записи для корректной транзакции. Отключение этих кешей и буферов в других случаях обычно замедляет вашу программу.
Вот другое обсуждение кого-то с такой же проблемой (хотя они использовали .NET, а не C ++).
Редактировать: Спасибо за упоминание о размере Daryl.