NSIS检查是否存在空目录

时间:2014-03-19 11:58:03

标签: nsis

我需要检查是否已插入USB加密狗。我使用以下代码来执行此操作:

!macro HAS_USB_DONGLE
  IfFileExists "E:\*.*" hasDongle 0
  MessageBox MB_OK "USB Dongle is not inserted. Please insert the USB dongle and re-run this installer."
Abort

  hasDongle:
!macroend

但这仅适用于E:上有任何文件(或目录)的情况。如何检查是否存在空目录?

4 个答案:

答案 0 :(得分:1)

您的意思是特定文件夹吗?

IfFileExists可与文件,通配符或目录一起使用。

!macro HAS_USB_DONGLE
  IfFileExists "E:\ThisIsTheFolderYouAreLookingFor" hasDongle 0
  MessageBox MB_OK "USB Dongle is not inserted. Please insert the USB dongle and re-run this installer."
Abort

  hasDongle:
!macroend

答案 1 :(得分:1)

这是执行它的代码

!macro uni_isEmptyDir un
Function ${un}isEmptyDir
    # Stack ->                    # Stack: <directory>
    Exch $0                       # Stack: $0
    Push $1                       # Stack: $1, $0
    FindFirst $0 $1 "$0\*.*"
    strcmp $1 "." 0 _notempty
    FindNext $0 $1
    strcmp $1 ".." 0 _notempty
    ClearErrors
    FindNext $0 $1
    IfErrors 0 _notempty
    FindClose $0
    Pop $1                  # Stack: $0
    StrCpy $0 1
    Exch $0                 # Stack: 1 (true)
    goto _end
    _notempty:
        FindClose $0
    ClearErrors
    Pop $1                   # Stack: $0
    StrCpy $0 0
    Exch $0                  # Stack: 0 (false)
    _end:
FunctionEnd
!macroend

; make isEmptyDir function available both for installer and uninstaller
!insertmacro uni_isEmptyDir ""
!insertmacro uni_isEmptyDir "un."

安装程序部分的用法:

Push "Path to check"
Call isEmptyDir
Pop $0

卸载部分的用法:

Push "Path to check"
Call un.isEmptyDir
Pop $0

希望这有帮助。

答案 2 :(得分:1)

看到这已成为一个热门话题,我想我会发布自己的解决方案。我上面尝试的答案对我来说不可靠。我还没有测试过khayk提供的解决方案,这可能是最好的解决方案。最后,我通过创建一个虚拟文件,检查目录是否存在然后删除虚拟文件来解决问题。 Hacky,但适合我的使用。

!macro HAS_USB_DONGLE
  FileOpen $0 "$USB_DIR\dummy" w
  FileClose $0
  ClearErrors

  IfFileExists "$USB_DIR*" hasDongle 0
  MessageBox MB_OK "USB Dongle is not inserted. Please insert the USB dongle and re-run this installer."
  Abort

  hasDongle:
  Delete "$USB_DIR\dummy"
  ClearErrors
!macroend

答案 3 :(得分:0)

看看this function

另请注意,您的宏无效。宏是重复的代码,您不能多次使用相同的标签(在同一部分/功能内)。