golang os.Create cause"没有这样的文件或目录"错误

时间:2017-04-11 02:53:31

标签: file go

一定是简单的事情,但我似乎无法弄明白。我一直得到"没有这样的文件或目录"错误。以为Create函数是创建一个新文件?     包主要

import (
  "log"
  "os"
)

func main() {
  f, err := os.Create("~/golang-server.log")
  defer f.Close()
  if err != nil {
    panic(err.Error())
  }
  log.SetOutput(f)
}

2 个答案:

答案 0 :(得分:4)

您不能使用~或环境变量(如$HOME)来指定文件路径,它们是字符串文字并表示实际路径。您得到的错误是因为它将~/golang-server.log视为当前目录的相对路径,并且当前目录中没有目录~

使用手动创建的子目录~,您的代码将成功:

 ~/test/ mkdir \~
 ~/test/ go run t.go
 ~/test/ ls \~
golang-server.log

因此需要将absolute pathrelative path传递给os.Create

答案 1 :(得分:0)

您可以使用os.ExpandEnv处理“〜”,仅在sh / bash上下文中有意义。

os.Create(os.ExpandEnv("$HOME/golang-server.log"))

在更复杂的情况下,您需要确保基本目录存在,因为os.Create不会处理它。

这就是os.Create("~/golang-server.log")失败的原因,因为基本目录不存在,并且os.Create不会自动为您创建它。您需要这样自己完成:

func EnsureBaseDir(fpath string) error {
    baseDir := path.Dir(fpath)
    info, err := os.Stat(baseDir)
    if err == nil && info.IsDir() {
       return nil
    }
    return os.MkdirAll(baseDir, 0755)
}

注意:

  • $HOME并不总是存在,例如该程序作为系统级systemd服务运行。因此,最好不要在生产环境中使用$HOME
  • os.Create的局限性不仅存在于Go中。它是由OS内核引起的,并广泛存在于其他语言/ stdlib中。