NSIS - 如何阻止它创建目录?

时间:2016-12-07 14:22:30

标签: nsis

卸载后,我会浏览已安装的子目录列表(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在检查它们是否存在时创建目录?我在网上寻找解决方案,但一无所获。

1 个答案:

答案 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