У меня периодически возникает проблема с приложением в дикой природе.
У него довольно простой XML-файл, который он время от времени выгружает, что-то примерно каждые 30 минут.
Файлы данных часто бывают очень маленькими - например, <5 КБ.
Он не блокирует файл - он просто каждый раз воссоздает его с нуля.
Мне повезло. чтобы увидеть проблему cur на тестовой машине, и я заметил, что файл был поврежден и установлен на "нули" (т. е. 00 в шестнадцатеричном формате). Что действительно странно, так это то, что это точно правильная длина по сравнению с той, которой она должна была быть.
Я старался быть очень осторожным в процессе сохранения:
Я даже блокирую 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: Какие еще процессы обращаются к файлу?