登录
首页 >  Golang >  Go问答

如何运行我创建的程序中的文件?

来源:stackoverflow

时间:2024-03-18 16:03:35 466浏览 收藏

在 Go 程序中创建 .ics 文件后,需要运行该文件以将其添加到操作系统日历应用程序。通过 exec.Command 运行文件时遇到权限被拒绝的错误。为了解决此问题,需要在程序中设置执行标志。此外,延迟关闭文件可能导致其他进程无法访问该文件,因此建议在关闭文件之前同步文件。

问题内容

我正在尝试执行我的程序刚刚创建的.ics 文件。基本上,我的程序是简单的 cli 日历应用程序,它生成 .ics 文件。如果我的程序能够执行此文件并将其直接添加到操作系统日历应用程序,而不需要通过操作系统 gui 进行不必要的搜索和执行,那就太好了。 我粘贴 main 函数以更好地理解。

func main() {

    serialized, name := cal()

    f, err := os.Create(name + ".ics")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    _, err2 := f.WriteString(serialized)
    if err2 != nil {
        log.Fatal(err2)
    }
    cmd := exec.Command(name + ".ics")
    err = cmd.Run()
    if err != nil {
        log.Fatal(err)
    }
}

如图所示,我尝试使用 exec.command,但它不起作用。我什至尝试使用其他前缀,例如 ./~/,但它也不起作用。

错误消息:

fork/exec ./meeting.ics:权限被拒绝

exec:“meeting.ics”:在 $path 中找不到可执行文件

总结一下 - 我想跳过用户必须查找文件并打开它的过程。我想将其自动作为我的应用程序的一部分。

这是我的存储库,如果有帮助的话 https://github.com/lenoopaleno/golang-calendar

我正在使用 wsl 2、ubuntu 22.04


正确答案


除了上面的注释之外,您的代码中可能存在 defer f.close() 的问题

延迟在函数结束时运行。在那之前,您的文件可能会也可能不会被其他进程关闭和访问。 其次,您很可能必须在程序上设置一个执行标志才能在 unix 风格的操作系统下运行。

程序调整:

func main() {

    serialized, name := cal()

    f, err := os.Create(name + ".ics")
    if err != nil {
        log.Fatal(err)
    }

    _, err2 := f.WriteString(serialized)
    if err2 != nil {
        log.Fatal(err2)
    }
    f.Sync()
    f.Close()
    exec.Command(`chmod +x `+name+".ics").Run() // This can be done prettier
    cmd := exec.Command(name + ".ics")
    err = cmd.Run()
    if err != nil {
        log.Fatal(err)
    }
}

理论要掌握,实操不能落!以上关于《如何运行我创建的程序中的文件?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>