2016-12-07 28 views
0

卸载后,我会查看已安装的子目录(List - C#)并将其删除。我检查一个目录是否存在,如果有,我想删除它。下面的代码:NSIS - 如何阻止它创建一个目录?

//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

我真的不知道这是怎么可能的,${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 
+0

谢谢,它已经奏效。相信我,我最初的方法是否创建一个文件夹 - 这是可能的!我刚刚再次测试过。如果您首先删除testfolder1,然后再删除testfolder1 \ testfolder2,则testfolder1将保留在那里(已创建)。如果你交换命令,都会被删除!如果你愿意,你可以自己尝试一下。 – Dovile

+0

我告诉你这是不可能的。不要使用Explorer进行检查,因为它不可信。 – Anders

相关问题