我有一个程序,它试图使用Golang将文件写入目录.我需要它能够在MacOS、Linux和Windows中工作(至少).

Golang提供了以下测试--但它似乎只适用于Linux(来自下面链接的SO问题):

func IsWritable(path string) (isWritable bool, err error) {
    isWritable = false
    info, err := os.Stat(path)
    if err != nil {
        fmt.Println("Path doesn't exist")
        return
    }

    err = nil
    if !info.IsDir() {
        fmt.Println("Path isn't a directory")
        return
    }

    // Check if the user bit is enabled in file permission
    if info.Mode().Perm() & (1 << (uint(7))) == 0 {
        fmt.Println("Write permission bit is not set on this file for user")
        return
    }

    var stat syscall.Stat_t
    if err = syscall.Stat(path, &stat); err != nil {
        fmt.Println("Unable to get stat")
        return
    }

    err = nil
    if uint32(os.Geteuid()) != stat.Uid {
        isWritable = false
        fmt.Println("User doesn't have permission to write to this directory")
        return
    }

    isWritable = true
    return
}

我看到了这个答案[1],但这个问题已经10年没有出现了,有什么比条件编译更好的方法来完成这个任务吗?

摘要:我只想让Go进程了解它是否可以写入给定的目录.

[1]How to tell if folder exists and is writable?

推荐答案

这就是我在没有条件编译的情况下实现目标的方式,因为不同的操作系统可能会有不同的权限和特权.

  • 我try 在该目录中创建一个包含os.CreateTemp的临时文件.如果函数没有返回错误,这表明路径或权限没有问题,我们可以在该目录中创建文件.

以下是代码

func IsWritable(path string) (bool, error) {
    tmpFile := "tmpfile"

    file, err := os.CreateTemp(path, tmpFile)
    if err != nil {
        return false, err
    }

    defer os.Remove(file.Name())
    defer file.Close()

    return true, nil
}


func main() {
     path := "absolute-directory-path"

    isWritable, err := IsWritable(path)
    if err != nil {
       panic(err)
    }

    if isWritable {
      // statements
    }

}

Go相关问答推荐

如何使用Docker Compose配置Go,使main. go文件位于/CMD文件夹中

Go在使用HTTP代理时如何处理DNS请求?

Golang文本/模板序列范围

";无效的复制因子;融合Kafka Go客户端

仅使用公共 api 对 alexedwards/scs 进行简单测试

Go time.Parse 无效的 ISO 日期

如何将已知类型转换为指向switch 中类型参数的指针?

Github Actions Go lambda 项目不同的 sha256sums

由于 main.go 文件中的本地包导入导致构建 docker 容器时出错

GRPC 元数据未在 Go 中更新

当有多个同名包时如何在vscode中显示golang包完整路径?

有没有办法判断值是否满足接口中定义的类型约束?

vs 代码调试 go 测试不通过标志

Unescape 在 rss 中两次逃脱了标题

什么是无效字符实体 &ccb

使用 xml.Name 将 xml 解组为 [] struct

Go 赋值涉及到自定义类型的指针

Go 错误:Is() 和 As() 声称是递归的,是否有任何类型实现错误接口并支持这种递归 - 无错误?

是否存在一个Go泛型类型约束,该约束捕获了将类型用作映射中的键的能力?

将函数的值作为输入参数返回给另一个