Файл закрыть окно выпуска - PullRequest
3 голосов
/ 12 июля 2011

Мы используем File.WriteAllBytes для записи данных на диск. Но если перезагрузка происходит примерно в то время, когда мы закрываем файл, windows добавляет в файл значение null. Похоже, это происходит в Windows 7. Поэтому, как только мы вернемся к файлу, мы увидим в нем пустые значения. Есть ли способ предотвратить это. Окно закрывает свою внутреннюю ручку через определенное время и может ли оно быть принудительно закрыто немедленно?.

Ответы [ 4 ]

5 голосов
/ 12 июля 2011

В зависимости от того, какое поведение вы хотите; вы можете поместить его в ИБП, как предложено 0A0D; но кроме того, вы можете использовать Windows Vista + Transactional NTFS функциональность. Это позволяет вам атомарно записывать в файловую систему. Так в вашем случае; ничего будет записано, а не неправильные данные. Он еще не является частью .NET Framework; но есть много управляемых упаковщиков, которые можно найти в Интернете.

Иногда нет данных лучше, чем неправильные. Когда ваше приложение запускается снова; он может видеть, что файл отсутствует; он может «продолжить» с того места, где остановился; в зависимости от того, что делает ваше приложение.

1 голос
/ 12 июля 2011

Судя по вашим комментариям, нет никаких гарантий при записи файла, особенно если вы теряете энергию во время записи файла. Лучше всего поставить компьютер на источник бесперебойного питания. Если вам удастся создать механизм автоматического восстановления, например, продукты Microsoft Office, это предотвратит полную потерю данных, но не исправит отсутствующие данные при отключении питания.

0 голосов
/ 13 июля 2011

Мне приходилось иметь дело с чем-то похожим;по сути, встроенная система, работающая в Windows, где ожидается, что питание может быть отключено в любое время.

На практике я понимаю, что файл записывается на диск менее чем за 10 секунд до потери.of-power означает, что файл будет поврежден.(Я использую 30 секунд в своем коде, чтобы воспроизвести его безопасно).

Я не знаю ни одного способа гарантировать из кода, что файл был полностью закрыт, записан на диск и что оборудование диска завершеноего пишет.Кроме того, чтобы знать, что прошло 10 (или 30) секунд.Это не очень удовлетворительная ситуация, но она есть.

Вот несколько указателей, которые я использовал в реальном встроенном проекте ...

  • Используйте систему контрольных сумм ифайлы резервных копий.
  • Контрольные суммы: в конце любого файла, который вы пишете, включите контрольную сумму (если это пользовательский XML-файл, возможно, включите какой-либо тег <checksum .../>).Затем при чтении, если тег контрольной суммы отсутствует или не соответствует данным, вы должны отклонить файл как поврежденный.
  • Резервные копии: каждый раз, когда вы пишете файл, сохраняйте копию в одномиз двух резервных копий;произнесите A и B. Если A существует на диске, но ему менее 30 секунд, вместо этого скопируйте в B.Затем, прочитав, сначала прочтите исходный файл.Если поврежден, то читайте A, если поврежден, то читайте B.

Также

  • Если это встроенная система, вам нужно запустить команду DOS "chkdsk / F"на диске, на который вы записываете, при загрузке.Потому что, если вы получаете поврежденные файлы, то вы также получите поврежденную файловую систему.
  • Дисковые системы NTFS должны быть более устойчивыми к ошибкам, чем FAT32.Но я считаю, что NTFS-дискам также может потребоваться больше времени для полной очистки их данных.Я использую FAT32, когда могу.

Заключительная мысль: если вы действительно используете встроенную систему под Windows, вам лучше узнать больше о Windows Embedded и системе Enhanced Write Filter.

0 голосов
/ 12 июля 2011

Я бы посчитал это случаем фатального исключения (внезапная потеря мощности). Вы ничего не можете с этим поделать, и, как правило, попытки справиться с ними только ухудшают ситуацию.

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