Безопасно ли использовать RmDir /r $INSTDIR в NSIS?

Я заметил это предупреждение в документации по методу NSIS RmDir:

Предупреждение: использование RMDir /r $INSTDIR в деинсталляторе небезопасно. Хотя это маловероятно, пользователь может выбрать установку в папку Program Files, и поэтому эта команда сотрет всю папку Program Files, включая другие программы, которые не имеют ничего общего с программой удаления.

Это меня пугает, так как до сих пор я не рассматривал такую ​​возможность и у меня была именно эта строчка в моем сценарии. Но когда я проверил, произойдет ли это, установив мою программу в уже существующее место, содержащее уже существующие файлы, а затем запустив программу удаления с RmDir /r /REBOOTOK $INSTDIR, существующие файлы остались невредимыми.

Это устаревшее предупреждение? Я использую NSIS версии 2.46.

Спасибо


person Cuga    schedule 15.07.2010    source источник


Ответы (2)


RmDir /r удалит все дерево каталогов, если сможет, поэтому это «небезопасно». См. http://nsis.sourceforge.net/Uninstall_only_installed_files, чтобы узнать, как удалить только те файлы, которые вы устанавливаете.

person Anders    schedule 16.07.2010
comment
Что, если бы я создал подпапку в $INSTDIR и поместил туда все данные моей программы, рекурсивно удалил этот подкаталог, а затем сделал обычный RmDir в исходном $INSTDIR? - person Cuga; 16.07.2010
comment
Ну, это помогло бы, но проблема все еще может быть там. Допустим, ваша подпапка называется system32, и пользователь устанавливает ее в %windir%, затем вы удалите %windir%\system32. - person Anders; 16.07.2010
comment
Думаю, я рискну и создам внутри INSTDIR поддиректорию с именем: ‹program_name-version›... Думаю, это должно сработать. - person Cuga; 16.07.2010
comment
Пример кода не удаляет $INSTDIR. Должен ли я просто оставить каталог там, или есть безопасный способ сделать это? - person parsley72; 15.06.2011
comment
Этот метод удаления только установленных файлов слишком сложен. Я знаю, что это мое мнение, и я действительно думаю, что должен быть более простой способ сделать это. Он слишком подвержен ошибкам и занимает слишком много строк кода. - person Jason; 10.09.2018

RMDir в каталоге без флага /r (рекурсивный) удалит каталог, если он пуст. В какой-то момент они добавили эту функцию, не знаю когда.

Справочник по сценариям NSIS — RMDir

person mcNux    schedule 05.01.2012