一定是简单的事情,但我似乎无法弄明白。我一直得到"没有这样的文件或目录"错误。以为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)
}
答案 0 :(得分:4)
您不能使用~
或环境变量(如$HOME
)来指定文件路径,它们是字符串文字并表示实际路径。您得到的错误是因为它将~/golang-server.log
视为当前目录的相对路径,并且当前目录中没有目录~
。
使用手动创建的子目录~
,您的代码将成功:
~/test/ mkdir \~
~/test/ go run t.go
~/test/ ls \~
golang-server.log
因此需要将absolute path
或relative 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中。