Unbuffer запись в файл, совместимая с Юникодом и кросс-платформенная - PullRequest
1 голос
/ 29 января 2012

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

Я не знаю, какую функцию я могу использовать для этого.

Для ясности, я реализую функцию обратного вызова для записи и функцию обратного вызова для чтения, и они будут обрабатывать запись или чтение, когда любое стороннее приложение в ОС хочет выполнить запись иличтение с жесткого диска.

NEED:
-Мне нужно работать с файлами, которые имеют имена Unicode.
-Мне нужно писать в небуферизованном режиме.
-Мне нужносделать это для Windows, Linux, Mac.

Я использую C ++ и Qt.Хотя QFile имеет синтаксис для открытия файлов в небуферизованном режиме, в документах говорится, что он не работает с Windows (то есть QFile всегда находится в буферизованном режиме в Windows).

Это приводит к сбою приложения из-за ошибок записи в Windows.В идеале я не хотел бы использовать отдельную функцию (+ lib) для каждого типа ОС, но я понимаю, что мои возможности могут быть не очень хорошими в моих поисках кросс-платформенной совместимости.В любом случае, я с нетерпением жду предложений относительно того, какие функции мне следует использовать для каждой платформы, если не существует такой, которая могла бы сделать это для всех 3.

1 Ответ

2 голосов
/ 29 января 2012
  • Для Windows вам нужна функция CreateFile() с флагом FILE_FLAG_NO_BUFFERING.
  • В Linux вам нужна open() с опцией O_DIRECT, но учтите, что онаподдерживается только начиная с ядра 2.4.10.
  • В OS X вам нужно после каждой записи вызывать fsync().

Но я должен предупредить васэтот небуферизованный ввод-вывод не минимизирует дисковый ввод-вывод и, скорее всего, сильно ухудшит производительность вашего приложения.Не выполняйте прямой ввод-вывод, если вы действительно не знаете, что делаете, не знаете, как буферизация ОС влияет на производительность, и у вас есть четкое объяснение того, почему небуферизованный ввод-вывод будет быстрее.Если вы все еще хотите продолжить, не забудьте измерить производительность до и после.Ваши шансы на ложную оптимизацию и даже на еще худшие вещи равны 9 из 10.

Что касается соответствия Юникоду - это не имеет значения.Запись занимает адрес памяти и количество байтов для записи.Вы можете написать Unicode, ASCII, любые двоичные данные и т. Д. В случае с Unicode вам просто нужно помнить, чтобы не путать длину строки с размером строки.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...