Golang 路径问题 no such file or directory
config.xml就在config包中
package config
import (
"bufio"
"os"
)
func Config() (cfg string,err error){
f, err := os.Open("config.xml")
if err != nil {
return
}
r := bufio.NewReader(f)
cfg,err = r.ReadString('\n')
return
}
在同一个包下做测试,结果和预期一样
package config
import (
"fmt"
"io"
"testing"
)
func TestConf(t *testing.T) {
cfg, err := Config()
if err != nil && err != io.EOF {
t.Error(err)
}
if cfg == "" {
t.Error("文件没有内容")
}
fmt.Printf("cfg: %v\n", cfg)
}
cfg: 这是一个配置文件
PASS
但在另一个包下,却出现
open config.xml: no such file or directory
cfg:
package main
import (
"fmt"
"io"
"src/src/fileproblem/config"
)
func main(){
cfg, err := config.Config()
if err != nil && err != io.EOF {
fmt.Println(err)
}
fmt.Printf("cfg: %v\n", cfg)
}
在Config中加入 fmt.Println(filepath.Abs(“./”)) 打印绝对路径
....../src/fileproblem/config
....../src/fileproblem/package1
可以发现谁调用,路径就是谁的。这也就是为什么在不同的包下会出现no such file or directory问题了
如何解决
在window中可以尝试用以下函数,得到执行时的绝对路径
filepath.Abs("./")
os.Executable()
然后对路径进行公共目录切片,这里可以用“/src”或“//fileproblem”
pathfile := strings.Split(AbsPAath,"/fileproblem")
最后拼接配置文件的相对路径
filepath.Join(s,"/fileproblem/config/config.xml")
完整代码
func Config() (cfg string, err error) {
AbsPAath, _ := os.Executable()
pathfile := strings.Split(AbsPAath, "/fileproblem")
f, err := os.Open(filepath.Join(pathfile[0], "/fileproblem/config/config.xml"))
if err != nil {
return
}
r := bufio.NewReader(f)
cfg, err = r.ReadString('\n')
return
}