【问题标题】:File.Exists not working when application is run from NSIS installer从 NSIS 安装程序运行应用程序时 File.Exists 不起作用
【发布时间】:2016-04-28 14:15:26
【问题描述】:

我编写了一个简单的固件更新实用程序,它需要作为安装程序的一部分运行。安装程序将主应用程序以及二进制固件文件和固件更新安装程序全部安装到安装目录中。在更新实用程序中,我会先检查文件是否存在,然后再尝试将其上传到我的设备。

if (!System.IO.File.Exists("My_Firmware.bin"))
  //handle error

这将返回 false 并且我的实用程序失败,但仅在直接从 NSIS 安装程序调用时。如果我通过双击可执行文件直接从安装目录运行该实用程序,它工作正常。我正在使用ExecWait 来运行该实用程序。

ExecWait '"$INSTDIR\UpdateUI.exe"'
IfErrors 0 noError
messageBox MB_OK "No firmware was installed!"

我已尝试以管理员身份运行安装程序。我还尝试将安装目录更改为不太可能出现权限问题的地方。我尝试只使用 Exec 得到相同的结果。我还尝试删除File.Exists 检查文件是否会打开,但它没有。

【问题讨论】:

  • 您使用的是相对路径。这样的路径总是相对于working directory。你确定working directory 在这两种情况下都是一样的吗?请注意,working directory 并不总是与您的程序所在的位置相同。

标签: c# nsis


【解决方案1】:

NSIS 没有将当前工作目录设置为该文件夹,这会导致您的可执行文件失败。

一种选择是在命令行中传递完整路径:

ExecWait '"$INSTDIR\YourProgram.exe" "$INSTDIR\My_Firmware.bin"'

这将允许您从命令行参数中读取程序,并使用文件(带有完整路径)而不是将其硬编码到当前目录。

【讨论】:

    【解决方案2】:

    您可以在 NSIS 中使用SetOutPath 设置工作目录。

    【讨论】:

    • 这就是我最终所做的,它解决了问题。 setOutPath $INSTDIR
    猜你喜欢
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    相关资源
    最近更新 更多