为了账号安全,请及时绑定邮箱和手机立即绑定

os.IsNotExist 但得到“不是目录”

os.IsNotExist 但得到“不是目录”

Go
翻过高山走不出你 2021-09-09 21:45:51
我不明白,为什么我不能创建一个文件夹并写入一个文件,然后再次读取它 - 在同一个 func 中使用相同的路径,只是为了测试?当我在文件上运行“go test myio_test.go”时。我得到myio_test.go...func TestMyIo(t *testing.T) {    myio.CreateTempJsonFile()}....myio.gopackage myioimport (    "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("create: ", filePath) 打印:/private/var/folders/yj/jcyhsxxj6ml3tdfkp9gd2wpr0000gq/T/go-build627785093/command-line-arguments/_test/myio.test/json这很奇怪,因为每个测试都会创建一个新的“/go-buildxxx/”文件夹,因此该文件夹实际上不应该在那里?有任何想法吗?
查看完整描述

1 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

首先,您需要将可执行文件从它的基本路径中分离出来,因为它是从 osext

exePath, _ := osext.Executable()
base, _ := filepath.Split(exePath)

(或使用osext.ExecutableFolder()

然后您需要创建具有权限的目录0755。目录需要设置可执行位才能遍历它们。


查看完整回答
反对 回复 2021-09-09
  • 1 回答
  • 0 关注
  • 353 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信