Определить, когда Windows перезагрузилась после сбоя или сбоя питания - PullRequest
6 голосов
/ 02 марта 2011

Кто-нибудь знает, возможно ли определить, предшествовала ли последняя загрузка при сбое питания в Windows?

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

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

Ответы [ 3 ]

5 голосов
/ 02 марта 2011

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

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

2 голосов
/ 02 марта 2011

Почему бы не проверить, завершился ли ваш процесс изящно? Поместите какой-нибудь специальный маркер в реестр или в файловую систему, это будет означать, что ваш процесс все еще работает, и удалите его при корректном завершении работы. Затем проверяйте это при каждом запуске.

1 голос
/ 02 марта 2011

Как простая реализация, не будет ли CreateFile с FILE_FLAG_DELETE_ON_CLOSE (за которым обязательно следует FlushFileBuffers) просто не работать?

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

В случае сбоя питания или конца света у ОС не будет возможности закрыть какие-либо маркеры или удалить какие-либо файлы.Таким образом, файл все еще будет присутствовать после перезагрузки системы.

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