надо добавить информацию сначала в один файл, потом во второй,
если процесс оборвался перед записью во второй файл,
то изменения в первом файле должны откатиться, как такое можно реализовать?
Підтримати Україну у боротьбі з країною-терористом.
Здравствуйте, #John, Вы писали:
J>Здравствуйте,
J>надо добавить информацию сначала в один файл, потом во второй, J>если процесс оборвался перед записью во второй файл, J>то изменения в первом файле должны откатиться, как такое можно реализовать?
Что за файлы? Текстовые? Какой размер файлов? Можно ли их перезаписать целиком?
Здравствуйте, #John, Вы писали:
J>Здравствуйте,
J>надо добавить информацию сначала в один файл, потом во второй, J>если процесс оборвался перед записью во второй файл, J>то изменения в первом файле должны откатиться, как такое можно реализовать?
А что делать, если откат в первом файле тоже не удался? Простой алгоритм защиты от сбоев здесь не поможет. Нужно что ни будь вроде Транзакционная NTFS
Здравствуйте, #John, Вы писали:
J>надо добавить информацию сначала в один файл, потом во второй, J>если процесс оборвался перед записью во второй файл, J>то изменения в первом файле должны откатиться, как такое можно реализовать?
Здравствуйте, Qulac, Вы писали:
Q>А что делать, если откат в первом файле тоже не удался? Простой алгоритм защиты от сбоев здесь не поможет. Нужно что ни будь вроде Транзакционная NTFS
Похоже, что это не поддерживается в .net core ,
похоже придется писать в отдельный файл состояние транзакции,
а потом писать данные в файлы, и в случаи падения приложения,
откатывать данные из файла с состоянием транзакции.
Підтримати Україну у боротьбі з країною-терористом.
Здравствуйте, #John, Вы писали:
J>надо добавить информацию сначала в один файл, потом во второй, если процесс оборвался перед записью во второй файл, то изменения в первом файле должны откатиться, как такое можно реализовать?
Вам нужен журнал изменений, а вообще взяли бы вы sqlite. Руками это писать вы утомитесь.
Здравствуйте, #John, Вы писали:
J>Здравствуйте, Qulac, Вы писали:
Q>>А что делать, если откат в первом файле тоже не удался? Простой алгоритм защиты от сбоев здесь не поможет. Нужно что ни будь вроде Транзакционная NTFS
J>Похоже, что это не поддерживается в .net core , J>похоже придется писать в отдельный файл состояние транзакции, J>а потом писать данные в файлы, и в случаи падения приложения, J>откатывать данные из файла с состоянием транзакции.
Гиморно, ведь сбой может произойти и при попытке откатить неудачную транзакцию и т.д. Лучше поискать что ни будь готовое. Если что на практике, восстановление бд, тоже оформляется в виде транзакции с записью в журнал, что бы при неудачной попытке восстановления её можно было бы повторить.
Здравствуйте, #John, Вы писали:
J>надо добавить информацию сначала в один файл, потом во второй, J>если процесс оборвался перед записью во второй файл, J>то изменения в первом файле должны откатиться, как такое можно реализовать?
Вам правильно порекомендовали выше заюзать ntfs-transaction или готовую СУБД вместо работы с файлами, где механизм транзакций поддерживается из коробки.
Но! В качестве разминки попробую предложить альтернативу. Итак:
1. К каждой записи добавляете проверку целостности (хеш). Т.е. считываете строку и можете проверить не оборвалась ли она на середине.
2. При запуске вашей проги проверяете конец файлов — корректные ли там данные (т.е. целостность). Если оборвалось — то урезает (Seek) до предыдущей записи. Проверять нужно и первый и второй файл.
3. Если сбой произошел штатно, т.е. завершение процесса не произошло (а, к примеру, файл был заблокирован другим процессом) — то это отлавливается исключениями.
Пока не вижу подводных камней, но к критике готов.
Здравствуйте, Shmj, Вы писали:
S>Пока не вижу подводных камней, но к критике готов.
А если между запись в первый и второй файл закончилось место на диске или комп вырубился. Получается, что нужен еще отдельный файл журнала со списком хешей.