Низкоуровневая обработка файловых операций в Linux и Windows c ++

0

Хотя есть похожие вопросы, как здесь или здесь, у меня есть вопрос о другом случае.

Используя C/C++, я хочу записать несколько байтов в файл. Первоначально файл имеет данные. Просто обновляю содержимое файла: открываю, пишу и закрываю. Однако, если он не работает во время записи, и если мы не сможем справиться с отказом (например, сбой приложения, прерывание, выключение электричества и т.д.), Что гарантируется в выходном файле между приведенным ниже списком? Какая ситуация может произойти, чего не может?

  1. Файл может быть пустым (удалены существующие значения и не могут писать новые)
  2. Файл остается заблокированным
  3. Файл может содержать как старые значения, так и новые значения (т.е. первые 5 строк являются новыми значениями, последние 5 строк являются старыми значениями)
  4. Файл может содержать старое значение.
  5. Что-нибудь другое, чего я не ожидаю?

Если вы можете дать мне независимые от ОС подходы, я был бы рад

благодаря

  • 2
    В каком режиме вы открываете выходной файл (запись, добавление и т. Д.)?
  • 0
    Я использую режим записи.
Показать ещё 4 комментария
Теги:
file

1 ответ

3
Лучший ответ

Напишите новые данные в файл с тем же именем, но с расширением 'tmp'. Сбросьте и закройте файл tmp. Удалите исходный файл. Переименуйте файл tmp в исходное имя файла.

При запуске сканируйте папку для всех файлов. Удалите все файлы tmp, чья часть имени соответствует существующему файлу 'source' (т.е. система была прервана во время записи файла tmp). Переименуйте любой файл tmp, чья часть имени не соответствует существующему исходному файлу (был записан файл tmp, исходный файл был удален, но система была прервана до переименования).

Эта система зависит от атомарности удаления исходного файла. Если это удастся, вы получите новые данные, если они не пройдут, вы получите старые данные. Вы не должны получать бит каждого.

  • 0
    Благодарю. Хороший подход. Я также понимаю из вашего ответа, что можно столкнуться с ситуацией № 3.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню