Можно ли открыть файл fstream, если он уже запущен?
У меня есть случай, когда мне нужно открыть MyProg.exe после его запуска, внести некоторые изменения и сохранить его снова, заменив себя. Мы привыкли называть этот самоизменяющийся код, который получил название серьезно плохого кода. Тем не менее, у меня есть настоящий случай использования белой шляпы, и я хотел бы сделать именно это.
Этот код не открывается при открытии:
std::fstream inOutFile;
inOutFile.open( exePathName, std::ios_base::in | std::ios_base::out | std::ios_base::binary );
if( inOutFile.is_open() )
{ …
Чтобы проверить, можно ли это сделать обычными командами, я создал программу MyTest.exe, запустил ее из командной строки и запустил скопированный MyText.exe из другой папки поверх запущенного MyText.exe. Нет проблем, поэтому я знаю, что есть некоторые команды системных файлов, которые заставят его работать. Я просто надеялся использовать переносимые идиомы ISO C++ там, где смогу. Какие-нибудь мысли?
EDIT1: я обнаружил, что Windows теперь имеет полный набор функций восстановления и перезапуска приложений. За последние 2 года я заметил, что Microsoft стала намного лучше перезапускать приложения после, скажем, перебоев с питанием. Я подозреваю, что это связано с разработкой этого API. Fx, функция RegisterApplicationRestart решает мою проблему отлично.
РЕДАКТИРОВАТЬ 2: Мне пришлось отказаться от попытки использовать функции приложений и восстановления Microsoft, чтобы сохранить состояние командной строки. Они были слишком строгими и работали только для необработанных исключений и отсутствия реакции, а затем им требовались интерактивные пользовательские экраны. Fx, они бы не работали, если бы у вас было отключение питания, и вы просто хотели, чтобы ваше приложение использовало внутреннюю информацию о состоянии cmdline для перезапуска. Похоже, мне придется программировать самостоятельно.