卸载后,我会浏览已安装的子目录列表(List - C#)并删除它们。我检查目录是否存在,如果存在,我想删除它。这是代码:
//here it deletes the testfolder1 directory - perfect
${If} ${FileExists} "$MUSIC\testFolder1\*"
RMDir "$MUSIC\testFolder1"
${EndIf}
//problem - here, instead of ONLY CHECKING if directory exists,
// it creates "testFolder1" again!
${If} ${FileExists} "$MUSIC\testFolder1\testfolder2\*"
RMDir "$MUSIC\testFolder1\testfolder2"
${EndIf}
我知道我可以交换两个ifs并且它可以工作但是它没有解决任何问题,因为目录在我的列表中是随机顺序。有没有办法阻止NSIS在检查它们是否存在时创建目录?我在网上寻找解决方案,但一无所获。
答案 0 :(得分:0)
我真的不明白这是怎么可能的,${IfFileExists}
是IfFileExists
的包装,在内部,这个NSIS指令是用FindFirstFile
实现的。这没有办法创建目录!
好处是你不必使用${IfFileExists}
,因为RMDir
(没有/r
)只会删除目录,如果它是空的,如果它没有做任何事情不存在。
如果您不知道目录的顺序,也不知道它们是否可以在编译时嵌套,那么只要您成功删除至少一个项目,就必须继续尝试删除:
!include LogicLib.nsh
Section
CreateDirectory "$Temp\testFolder1"
CreateDirectory "$Temp\testFolder1\testfolder2"
!macro TryRMDir path counter
ClearErrors
${IfThen} ${FileExists} "${path}" ${|} IntOp ${counter} ${counter} + 1 ${|}
RMDir "${path}"
${IfThen} ${FileExists} "${path}" ${|} IntOp ${counter} ${counter} - 1 ${|}
!macroend
loop:
StrCpy $0 0
!insertmacro TryRMDir "$Temp\testFolder1" $0
!insertmacro TryRMDir "$Temp\testFolder1\testfolder2" $0
StrCmp $0 0 "" loop ; If we deleted anything we must try again
SectionEnd