Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Выполнить операцию при неожиданном завершении работы программы

#c_sharp #net #winforms


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

Объясню на своем примере. У меня создан простенький текстовый редактор с функцией
автосохранения. Через определенный интервал времени сохраняется временный файл с измененным
текстом, который без желания пользователя не был сохранен в главном файле. Временный
файл скрыт и зашифрован, как обычно это делается. Когда программа успешно завершает
работу, временный файл удаляется, а изменения сохраняются в главном файле, если пользователь
захотел сохранить. Все сохраняет, все удаляет.

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

Можете что-нибудь подсказать по данному вопросу?
    


Ответы

Ответ 1



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

Ответ 2



Бывают разные "неожиданные завершения программы", и сразу скажу, что желаемое поведение реализовать во всех случаях невозможно. Случай 1: было поймано непредвиденное исключение, программа решает завершить работу, чтобы избежать потери данных из-за неконсистентного состояния. Вы можете отловить событие непредвиденного исключения, однако данные в памяти могут быть повреждены, операции могут быть незавершены, поэтому сохранение пользовательских данных может запросто окончиться печально — повреждением или полной потерей информации. Сохранять в "основной файл" в этом случае можно, но не всегда разумно. Как минимум, необходимо оставить бэкап или другую информацию для восстановления. Случай 2: процесс был убит извне, или просто компьютер выдернут из розетки. Что можно сделать в этом случае? Абсолютно ничего, это событие невозможно обработать. Избежать проблем при таком развитии событий также могут помочь бэкапы при сохранении данных. То есть готовиться к подобному развитию событий надо заранее, и при запуске после непредвиденного завершения проверять, не остались ли несохранённые бэкапы от прошлого раза. В целом же, если вам требуются жёсткие гарантии сохранности и консистентности данных, транзакционность и прочие подобные фенечки, то посмотрите в сторону баз данных. P. S. У меня подозрения, что "скрытость" и "зашифрованность" у вас какие-то фиктивные, а потому бесполезные.

Комментариев нет:

Отправить комментарий