Причина поврежденного содержимого файла

У меня периодически возникает проблема с приложением в дикой природе.

У него довольно простой XML-файл, который он время от времени выгружает, что-то примерно каждые 30 минут.

Файлы данных часто бывают очень маленькими - например, <5 КБ.

Он не блокирует файл - он просто каждый раз воссоздает его с нуля.

Мне повезло. чтобы увидеть проблему cur на тестовой машине, и я заметил, что файл был поврежден и установлен на "нули" (т. е. 00 в шестнадцатеричном формате). Что действительно странно, так это то, что это точно правильная длина по сравнению с той, которой она должна была быть.

Я старался быть очень осторожным в процессе сохранения:

  1. Я записываю xml во временный файл в том же каталоге так как я собираюсь его действительно сохранить
  2. , я выполняю Win32 MoveFile () с установленным MOVEFILE_WRITE_THROUGH (так что он должен блокироваться до тех пор, пока перемещение не будет действительно и действительно завершено), чтобы переместить файл для замены существующий файл данных

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

Это случается не так часто, как, может быть, 1 из 1000 пользователей.

Теперь у меня есть ранее наблюдаемые файлы данных были повреждены из-за сбоя питания или BSOD во время записи, и я видел такие вещи, как 32 КБ файла, которые были полностью NULL.

Но похоже, что это происходит чаще, чем я ожидал, учитывая вероятность сбоя питания во время записи, особенно потому, что я использую MOVEFILE_WRITE_THROUGH.

Есть идеи?

Джон


Ответы на некоторые вопросы:

  • Q: Почему бы не писать напрямую в файл? О: Я избегал этого, чтобы сделать программное обеспечение менее уязвимым к сбоям питания. Например. вы на полпути к написанию файла и сбой / powerfail / BSOD, тогда у вас определенно есть поврежденный файл. Выполнение записи временного файла, а затем перемещения - это обычно используемый и простой способ гарантировать, что вы выполняете операцию с атомарным файлом, насколько это возможно (ну, насколько это разумно, без использования специальных API NTFS). Я должен сказать, что программное обеспечение представляет собой систему архивирования / резервного копирования, поэтому мне нужно больше заботиться о согласованности данных, чем другие приложения.

  • Q: Это происходит при нормальной работе?

  • A: Поскольку эта проблема возникает в дикая, я работаю только с несколькими подсказками, поэтому я не знаю наверняка. Могу сказать, что программа работает надежно в 99,9% случаев. Думаю, это суть моего вопроса: это просто случайная неудача, вызванная BSOD / сбоями питания, или это ошибка?

  • Q: Какая среда / ОС:

  • A: XP, Vista, 7, Server 200X. Скорее всего NTFS, но может быть FAT32

  • Q: Я закрываю файл перед перемещением

  • A: Да. Я использую потоки C ++ и вызываю close () перед выполнением MoveFile

  • Q: Какие еще процессы обращаются к файлу?

  • A: Ни один из них не управляется мной. Очевидно, что я не контролирую программу проверки вирусов, синхронизаторы папок и т. Д. Файл находится в папке AppData \ Local на компьютере пользователя.
7
задан John 30 June 2011 в 07:03
поделиться