2016-12-07 2 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으로 구현됩니다. 이것이 디렉토리를 만드는 방법이 아닙니다!

RMDir (/r 제외)은 비어있는 경우에만 디렉토리를 삭제하고 존재하지 않으면 아무 것도하지 않기 때문에 ${IfFileExists}을 사용할 필요가 없습니다.

당신은 디렉토리의 순서를 알 수없는 경우도 그들이 컴파일시에 중첩 될 수있는 경우 삭제 성공으로 당신은 한 삭제하려고 유지해야 하나 이상의 항목 :

!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

나는 그것이 가능하지 않다고 말하고있다. 탐색기를 사용하여 신뢰할 수 없기 때문에 검사하지 마십시오. – Anders

관련 문제