2015-04-10 3 views
2

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

Благодарим за любые советы.

ответ

4

Обычно вы бы просто проверить, если каталог существует:

Outfile "$%Temp%\Test.exe" 
RequestExecutionLevel user 
InstallDir "$Documents\Test" 

!include LogicLib.nsh 

Page Directory "" "" DirLeave 
Page InstFiles 

Function DirLeave 
${If} ${FileExists} "$InstDir\*" 
    MessageBox MB_YESNO `"$InstDir" already exists, delete it's content and continue installing?` IDYES yep 
    Abort 
yep: 
    RMDir /r "$InstDir" 
${EndIf} 
FunctionEnd 

Section 
SetOutPath $InstDir 
File myfile.ext 
SectionEnd 

Это также будет отображать сообщение, если каталог существует, но пуст. Чтобы обойти это, вам понадобится определенное выборочное обнаружение:

!macro _IsNonEmptyDirectory _a _b _t _f 
!insertmacro _LOGICLIB_TEMP 
!insertmacro _IncreaseCounter 
Push $0 
FindFirst $0 $_LOGICLIB_TEMP "${_b}\*" 
_IsNonEmptyDirectory_loop${LOGICLIB_COUNTER}: 
    StrCmp "" $_LOGICLIB_TEMP _IsNonEmptyDirectory_done${LOGICLIB_COUNTER} 
    StrCmp "." $_LOGICLIB_TEMP +2 
    StrCmp ".." $_LOGICLIB_TEMP 0 _IsNonEmptyDirectory_done${LOGICLIB_COUNTER} 
    FindNext $0 $_LOGICLIB_TEMP 
    Goto _IsNonEmptyDirectory_loop${LOGICLIB_COUNTER} 
_IsNonEmptyDirectory_done${LOGICLIB_COUNTER}: 
FindClose $0 
Pop $0 
!insertmacro _!= "" $_LOGICLIB_TEMP `${_t}` `${_f}` 
!macroend 
!define IsNonEmptyDirectory `"" IsNonEmptyDirectory` 

Function DirLeave 
${If} ${IsNonEmptyDirectory} "$InstDir" 
    MessageBox MB_YESNO `"$InstDir" already exists, delete it's content and continue installing?` IDYES yep 
    Abort 
yep: 
    RMDir /r "$InstDir" 
${EndIf} 
FunctionEnd 
Смежные вопросы