2016-12-07 4 views
0

Nach der Deinstallation, gehe ich durch eine Liste der installierten Unterverzeichnisse (Liste - C#) und lösche sie. Ich überprüfe, ob ein Verzeichnis existiert und wenn ja, möchte ich es entfernen. Hier ist der Code:NSIS - Wie kann ich verhindern, dass ein Verzeichnis erstellt wird?

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

Ich weiß, ich könnte die beiden ifs tauschen und es funktionieren würde, aber es löst nichts, weil Verzeichnisse in einer zufälligen Reihenfolge in meiner Liste sind. Gibt es eine Möglichkeit, NSIS daran zu hindern, Verzeichnisse zu erstellen, nachdem sie überprüft haben, ob sie existieren? Ich habe online nach einer Lösung gesucht, aber absolut nichts gefunden.

Antwort

0

Ich sehe nicht wirklich, wie das möglich ist, ${IfFileExists} ist ein Wrapper um IfFileExists und intern ist diese NSIS-Anweisung mit FindFirstFile implementiert. Es gibt keine Möglichkeit, ein Verzeichnis zu erstellen!

Der Vorteil ist, dass Sie nicht ${IfFileExists} verwenden müssen, weil RMDir (ohne /r) wird nur das Verzeichnis löschen, wenn er leer ist, und tut nichts, wenn sie nicht existiert.

Wenn Sie nicht wissen, die Reihenfolge der Verzeichnisse noch, wenn sie zum Zeitpunkt der Kompilierung verschachtelt werden können, dann müssen Sie immer wieder versuchen, so lange zu löschen, wie Sie mindestens ein Element zu löschen gelungen:

!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

Danke, es hat funktioniert. Vertrauen Sie mir, mein erster Ansatz schafft einen Ordner - es ist möglich! Ich habe es gerade noch einmal getestet. Wenn Sie zuerst testfolder1 und zweitens testfolder1 \ testfolder2 löschen, bleibt dort testfolder1 stehen (wird erzeugt). Wenn Sie die Befehle austauschen, werden beide gelöscht! Sie können es selbst ausprobieren, wenn Sie möchten. – Dovile

+0

Ich sage Ihnen, es ist nicht möglich. Verwenden Sie Explorer nicht, um zu überprüfen, da es nicht vertrauenswürdig ist. – Anders

Verwandte Themen