【问题标题】:os.Stat: permission denied => error(syscall.Errno) EACCES (13)os.Stat:权限被拒绝=>错误(syscall.Errno)EACCES(13)
【发布时间】:2022-01-24 15:19:00
【问题描述】:

我正在像这样的单元测试中创建一个目录:

// The directory which is going to be created next to unit test executable.
const DirName string = "test-files"

创建目录:

    // Create the directory if doesn't already exist.
    err := os.MkdirAll(DirName, os.ModeDir)
    if err != nil {
        return err
    }

    // Compose a sample file path to double-check its existence.
    pth := DirName + string(os.PathSeparator) + "samplefile.txt"


    exists, err := doesExist(pth)
    if err != nil {
        return err
    }

并检查文件是否存在:


// Does file exist?
func doesExist(pth string) (bool, error) {

    // Check file existence
    // https://stackoverflow.com/a/10510718/3405291
    if _, err := os.Stat(pth); err != nil {
        if os.IsNotExist(err) {
            return false, nil
        } else {
            return true, err
        }
    }

    // Above conditions are skipped,
    // therefore file exists.
    return true, nil
}

以上代码返回此错误:

os.Stat: 权限被拒绝

错误(syscall.Errno)EACCES(13)

我可以再次检查该目录是否已实际创建。但是权限是d---------:

> ls -lh
d--------- 2 m3 users    6 Dec 23 20:30 test-files

如何创建具有适当权限的目录?

【问题讨论】:

  • 您可以使用 os.Mkdir 来设置权限。
  • MkDir 已经在创建目录,您不需要设置目录模式位。但是,您确实需要设置正确的权限才能访问该目录。
  • @Spoofed os.MkdirAll 有权限参数吗?
  • 你知道umask吗?它可能在这里介入。当我们这样做时,请考虑使用path/filepath.Join 而不是使用+ 来搞乱字符串连接。

标签: go


【解决方案1】:

您正在滥用os.ModeDir 常量。它被发明用作位掩码来检查文件的mode+permissions bits(例如,os.(*File).Stat 返回的是否表明它是一个目录。

创建目录的默认权限模式位是0777,但它们受制于umask

【讨论】:

猜你喜欢
  • 2016-11-14
  • 2021-07-22
  • 2019-10-28
  • 2016-10-30
  • 2018-06-08
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
相关资源
最近更新 更多