首页 > 解决方案 > cmd.Run() 返回“文件不存在”错误

问题描述

我是 Golang 的新手,但它的明显优势之一是创建命令行工具,所以我认为一个有趣的小学习练习是在 Windows 上重新创建“触摸”命令。我编写了一个程序来在指定的文件路径或当前文件夹中创建一个新文件。这已经非常盛大了,我可以毫无问题地制作一个新文件:

func create_empty_file(file_name string) bool {
    filehandle, err := os.Create(file_name)

    if err != nil {
        return false
    }

    defer filehandle.Close()

    return true
}

我知道这部分正在工作,因为我可以观看正在制作的文件并在程序完成后打开它。我的问题是我想在创建后在 VSCode 中打开这个文件,显然有一些我不明白的地方os/exec。当我尝试运行它时:

command_string := strings.Join([]string{"code", full_filepath}, " ")
run_command := exec.Command(command_string)
run_err := run_command.Run()

然后我打印出(显然事先run_err检查)的内容,我得到了这个:nil

.Run() failed with error: exec: "code C:\\Go Code\\failed_successfully.go": file does not exist

如果我复制并粘贴"code C:\\Go Code\\failed_successfully.go"到我的命令提示符中,它会.go在 VSCode 中毫无问题地打开文件,所以很明显,这个调用有一些东西我错过/不明白。

我想它可能是在创建文件之前尝试打开文件,所以我查找了如何检查文件是否存在,然后使用Ticks 编写了一个短函数,它每隔几毫秒检查文件是否存在,并在文件存在true时返回找到它。否则,它会运行指定的秒数,然后返回 false。我仍然遇到同样的错误,所以我假设这不是问题。

我做的最后一件事是strings.Replace()用正斜杠替换所有反斜杠,这没有效果。

任何关于如何在这里实现我想要的建议都将不胜感激!

标签: go

解决方案


exec.Command不解析输入字符串,将其拆分为空格等。相反,将参数单独传递给exec.Command.

那是:

runCmd := exec.Command("code", full_filepath)

目前,您正在尝试找到一个名为code C:\\Go Code\\failed_successfully.go-- 而不是简单地调用code并使用参数调用它的命令。


推荐阅读