我无法理解,为什么我无法创建文件夹并写入文件,然后再次读取它 - 在相同的func中使用相同的路径,仅用于测试?
当我跑#34;去测试myio_test.go"在文件上。我得到了
myio_test.go
...
func TestMyIo(t *testing.T) {
myio.CreateTempJsonFile()
}
....
myio.go
package myio
import (
"fmt"
"io/ioutil"
"path"
//"syscall"
// "os"
"bitbucket.org/kardianos/osext"
"os"
)
func CreateTempJsonFile() {
exePath, _ := osext.Executable()
filePath := path.Dir(exePath + "/json/")
fmt.Println("create: ", filePath)
_, errx := os.Stat(filePath)
if os.IsNotExist(errx) {
errm := os.Mkdir(filePath, 0644)
if errm != nil {
fmt.Println("error creating dir...")
panic(errm)
}
}
writeError := ioutil.WriteFile(filePath+"/user.txt", []byte(`{"user": "Mac"}`), 0644) // os.ModeTemporary)// 0644)
if writeError == nil {
fmt.Println("Ok write")
} else {
fmt.Println("Error write")
}
_, err := ioutil.ReadFile(filePath + "/user.txt")
if err == nil {
fmt.Println("Reading file")
} else {
fmt.Println("Error reading file")
}
}
就像os.Stat(filePath)认为文件夹已经存在一样。如果我然后删除os.Stat()的检查,然后去创建文件夹我得到一个恐慌"而不是一个目录 "
fmt.Println("创建:",filePath)打印:
/private/var/folders/yj/jcyhsxxj6ml3tdfkp9gd2wpr0000gq/T/go-build627785093/command-line-arguments/_test/myio.test/json
这很奇怪,因为每个测试都会创建一个新的" / go-buildxxx /"文件夹,因此文件夹永远不应该在那里?
有什么想法吗?
答案 0 :(得分:2)
首先,您需要从osext
exePath, _ := osext.Executable()
base, _ := filepath.Split(exePath)
(或使用osext.ExecutableFolder()
)
然后,您需要创建具有权限0755
的目录。目录需要设置可执行位才能遍历它们。