snippetgoCritical
How can I open files relative to my GOPATH?
Viewed 0 times
howrelativefilesopencangopath
Problem
I'm using
And that works fine, but this isn't exactly portable. In my case, the files I want to open are in my GOPATH, for example:
Since the
But then I get this error:
panic: open data/file.txt: no such file or directory
How can I open files using their relative path, especially if they live alongside my Go code?
(Note that my question is specifically about opening files relative to the GOPATH. Opening files using any relative path in Go is as easy as giving the relative path instead of an absolute path; files are opened relative to the compiled binary's working directory. In my case, I want to open files relative to where the binary was compiled. In hindsight, this is a bad design decision.)
io/ioutil to read a small text file:fileBytes, err := ioutil.ReadFile("/absolute/path/to/file.txt")And that works fine, but this isn't exactly portable. In my case, the files I want to open are in my GOPATH, for example:
/Users/matt/Dev/go/src/github.com/mholt/mypackage/data/file.txtSince the
data folder rides right alongside the source code, I'd love to just specify the relative path:data/file.txtBut then I get this error:
panic: open data/file.txt: no such file or directory
How can I open files using their relative path, especially if they live alongside my Go code?
(Note that my question is specifically about opening files relative to the GOPATH. Opening files using any relative path in Go is as easy as giving the relative path instead of an absolute path; files are opened relative to the compiled binary's working directory. In my case, I want to open files relative to where the binary was compiled. In hindsight, this is a bad design decision.)
Solution
Hmm... the
Then I use
Note that, in my case, the data files are in a package separate from the
If there's a better way to use external resources with a Go program and keep it portable, feel free to contribute another answer.
path/filepath package has Abs() which does what I need (so far) though it's a bit inconvenient:absPath, _ := filepath.Abs("../mypackage/data/file.txt")Then I use
absPath to load the file and it works fine.Note that, in my case, the data files are in a package separate from the
main package from which I'm running the program. If it was all in the same package, I'd remove the leading ../mypackage/. Since this path is obviously relative, different programs will have different structures and need this adjusted accordingly.If there's a better way to use external resources with a Go program and keep it portable, feel free to contribute another answer.
Code Snippets
absPath, _ := filepath.Abs("../mypackage/data/file.txt")Context
Stack Overflow Q#17071286, score: 109
Revisions (0)
No revisions yet.