如何打开与我的 GOPATH 相关的文件?

新手上路,请多包涵

我正在使用 io/ioutil 读取一个小文本文件:

 fileBytes, err := ioutil.ReadFile("/absolute/path/to/file.txt")

这很好用,但这并不完全便携。在我的例子中,我想打开的文件在我的 GOPATH 中,例如:

 /Users/matt/Dev/go/src/github.com/mholt/mypackage/data/file.txt

由于 data 文件夹位于源代码旁边,我只想指定相对路径:

 data/file.txt

但后来我得到这个错误:

恐慌:打开数据/file.txt:没有这样的文件或目录

我如何使用它们的相对路径打开文件,尤其是当它们与我的 Go 代码一起存在时?

请注意,我的问题具体是关于打开相对于 GOPATH 的文件。 在 Go 中使用任何相对路径打开文件就像给出相对路径而不是绝对路径一样简单;文件是相对于已编译二进制文件的工作目录打开的。在我的例如,我想打开与二进制文件编译位置相关的文件。事后看来,这是一个糟糕的设计决定。)

原文由 Matt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 648
2 个回答

嗯… path/filepath 包中有 Abs() 它可以满足我的需要(到目前为止),尽管它有点不方便:

 absPath, _ := filepath.Abs("../mypackage/data/file.txt")

然后我使用 absPath 加载文件并且它工作正常。

请注意,在我的例子中,数据文件位于与我运行程序的 main 包不同的包中。如果它们都在同一个包中,我会删除前导 ../mypackage/ 。由于这个路径显然是相对的,不同的程序会有不同的结构,需要相应地调整。

如果有更好的方法在 Go 程序中使用外部资源并保持其可移植性,请随时提供另一个答案。

原文由 Matt 发布,翻译遵循 CC BY-SA 3.0 许可协议

这似乎工作得很好:

 import "os"
import "io/ioutil"

pwd, _ := os.Getwd()
txt, _ := ioutil.ReadFile(pwd+"/path/to/file.txt")

原文由 spencercooly 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题