【发布时间】:2017-09-29 02:26:53
【问题描述】:
这里的背景是我在golang中创建了一个安装程序(跨平台但最初针对windows)
我必须运行卸载过程。此过程的最后一步是删除我的应用程序二进制文件和另一个运行时文件。
我目前的方法是特定于 Windows 的,而且很差——无法确认进程已完成——基本上我只是从命令行调用 delete,使用 ping 来创建延迟,如下所示:
cmd := exec.Command("ping 127.0.0.1", "-n", "5", ">", "nul", "&&", "del", os.Args[0])
cmd.Start()
os.Exit(0)
正如我所说,这可行,但我希望能够在退出之前确认该过程已完成。我想象中的解决方案是启动某种内存中的 goroutine,它可以在应用程序生命周期之外持续存在而不锁定文件。 - 这可能吗?
注意 - 我还考虑过创建第二个 golang 应用程序(或这个应用程序的副本),它从临时目录中执行此删除操作(至少可以让我跨平台),然后让操作系统删除该副本但从我读过的内容来看,windows 在清除临时目录时并不是特别提示,所以我也不确定这是否理想。我希望安装/卸载循环使机器保持与找到它时相同的状态
关于我如何实现这一目标的任何其他建议?跨平台解决方案将是一个奖励。
更新 我建议的 ping 和删除解决方案实际上并没有像我希望的那样工作(至少不适用于系统文件夹中的文件)。我通过创建第二个 golang 应用程序来运行删除来解决这个问题,我将它生成到一个临时文件夹中,然后在注册表中创建一个 run_once 条目以在用户重新启动时删除该文件。
我仍然对这个解决方案不满意,感觉很老套。
我赞成 Adrian 的澄清,但欢迎任何有关替代方法的建议。
【问题讨论】:
标签: go