Сообщение от
Cs-Cs
Илья2282 Ну, обычно проект в CodeSys занимает 100-200 кб, если он средней нафаршированности и около 300-400 кб, если там дофига всего. Вот эмпирически размер проекта в 150 кб верный. Я хотел увидеть, есть ли какие-то явные отличия в размере. Ну, образно, файл станет в 0, 10, 512 кб и так далее.
Восстановить - никак. Файл заполнен нулями. Весь. Ничего там нет. Размер правильный, а внутри - нули.
И... зная работу WinAPI (а все программы через него обращаются к Windows, файлам и прочему) и файловой системы NTFS (которая поддерживает журналирование операций - то есть при сбое записи на диск по журналу операций может восстановить саму себя в некоторых пределах), можно предположить следующее развитие событий (это - версия, которую надо доказать, а не принимать на веру):
а) CodeSys хочет сохранить проект (автоматически или ещё как-то). Для чего использует вызов функции WinAPI CreateFileEx с флагами создания нового файла.
б) Пишет в этот файл данные и закрывает его, как обычно.
в) Файловая система NTFS журналирует эти операции (данные НЕ журналируются: журналируется состояние файлов на диске): "Ага... создали файл... записали. Размер файла - 150 кб, дата-время такие-то, запись завершена".
г) Постепенно эта информация начинает записываться на диск (на диски инфа пишется через буферы операционной системы, чтобы ускорить работу программ: сначала инфа попадает в буфер, а потом уже записывается на физический диск)
д) В этот момент что-то происходит с питанием Windows и по какой-то причине она принудительно выключается и данные записаться не успевают. Обычно, если Windows выключается не принудительно, то все буферы данных физически записываются на диск (Flush).
е) После следующего включения Windows файловая система видит незавершённую транзакцию в журнале операций и восстанавливает целостность самой себя (это НЕ "Проверка диска" - это именно внутренняя работа NTFS). Восстановление может происходит следующим образом:
* Если транзакция "Создали файл - записали - закрыли" завершена, то файл останется на диске, но будет заполнен нулями
* Если та же транзакция не завершена - то файла не будет вообще.
Я сталкивался с повреждением файлов в двух случаях (везде была операция с файлами - файл записывался программной или копировался с диска на диск):
а) Синий экран. Получал или файл нужного размера с нулями внутри (как у тебя) или файл нулевого размера.
б) Неожиданное отключение питания компа (когда это был не ноут, а обычный комп без UPS и пропадало 230V сети)
Стоит знать про режимы работы винды (для размышления):
* Завершение работы: программы корректно завершаются, все данные записываются на диск, на оперативную память - пофиг (содержимое не сохраняется, так как питание компа отключается)
* Гибернация: программы останавливатся, аппаратные устройства (Дисплей, USB) отключаются, все данные и содержимое оперативной памяти записываются на диск (и он отключается после завершения всех транзакций записи) и питание компьютера полностью отключается. Потом всё восстанавливается как было. Это самый надёжный режим выключения компа, если хочется продолжить работу с того же места!
* Спящий режим и его вариации: отключаются аппаратные устройства, данные сбрасываются на диск (Flush) и диск тоже отключается. А вот содержимое оперативной памяти и работа программ НЕ останавливается! Они могут работать в фоновом режиме и что-то делать.
Этот режим похож на блокировку экрана на смартфонах: экран погашен, а все приложения работают как обычно.
Современные винды (Win10/11) почему-то стараются даже при выключении компа кнопкой превратить его в планшет и держать его в именно этом режиме. "Они убили файлы. Сволочи!" ©
(Тут Melky был прав, да-да, это редкий случай)
На этом мои мысли кончились. Рекомедации:
а) Настроить ноут так, чтобы при нажатии кнопки питания ВСЕГДА включался режим гибернации. Если ноут надо будет перезагрузить целиком - то делать это через Пуск - Завершение работы / Перезагрузка.
б) Обязательно найти софт для бэкапа каждой версии файла и проекта. Я использую старый KLS Backup 2013 из торрентов, про который писал обзор.
Приучить себя к тому, чтобы периодически запускать резервирование: в момент важных изменений (написал FB - забэкапил, отладил FB - забэкапил) и после завершения работы над проектом. Дожидаться успешного завершения резервирования. Конкретно в KLS Backup есть режим на выбор: Выключить / Сон / Гибернация после окончания работы программы.
То есть, если надо закончить работу и вырубить комп - запускаем бэкап, ставим "Гибернация после завершения заданий бэкапа" - и дожидаемся, когда комп вырубится.
CodeSys (версий 2 и 3) имеет классную особенность: в тот момент, когда она сам не сохраняет проект, файл проекта доступен для чтения. То есть, можно его бэкапить, не закрывая среду разработки.
в) Включить в CodeSys в настройках создание бэкапов проекта. Это может и не помочь, так как бэкап создаётся той же записью в файл, и, если NTFS в этот момент проглючит - она и его поломает. Но пусть будет.