Golang正确实例化os.FileMode

Wil*_*l H 16 int file-permissions go

我看过无数的例子和教程,展示了如何创建一个文件,所有这些都只是通过设置文件的权限位来"欺骗".我想知道/了解如何正确实例化os.FileMode以在创建/更新文件期间提供给编写器.

一个粗略的例子如下:

func FileWrite(path string, r io.Reader, uid, gid int, perms string) (int64, error){
    w, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0664)
    if err != nil {
        if path == "" {
            w = os.Stdout
        } else {
            return 0, err
        }
    }
    defer w.Close()

    size, err := io.Copy(w, r)

    if err != nil {
        return 0, err
    }
    return size, err
}
Run Code Online (Sandbox Code Playgroud)

在上面的基本功能中,设置了权限位0664,虽然这可能有意义,但有时我更喜欢正确设置文件模式的方法.如上所示,一个常见的例子是UID/GID是已知的并且已经作为int值提供,并且perms是以前收集并作为字符串插入db的八进制数字.

Chr*_*ins 29

我的修复方法是定义自己的常量,因为我在os或syscall中找不到任何常量:

    const (
        OS_READ = 04
        OS_WRITE = 02
        OS_EX = 01
        OS_USER_SHIFT = 6
        OS_GROUP_SHIFT = 3
        OS_OTH_SHIFT = 0

        OS_USER_R = OS_READ<<OS_USER_SHIFT
        OS_USER_W = OS_WRITE<<OS_USER_SHIFT
        OS_USER_X = OS_EX<<OS_USER_SHIFT
        OS_USER_RW = OS_USER_R | OS_USER_W
        OS_USER_RWX = OS_USER_RW | OS_USER_X

        OS_GROUP_R = OS_READ<<OS_GROUP_SHIFT
        OS_GROUP_W = OS_WRITE<<OS_GROUP_SHIFT
        OS_GROUP_X = OS_EX<<OS_GROUP_SHIFT
        OS_GROUP_RW = OS_GROUP_R | OS_GROUP_W
        OS_GROUP_RWX = OS_GROUP_RW | OS_GROUP_X

        OS_OTH_R = OS_READ<<OS_OTH_SHIFT
        OS_OTH_W = OS_WRITE<<OS_OTH_SHIFT
        OS_OTH_X = OS_EX<<OS_OTH_SHIFT
        OS_OTH_RW = OS_OTH_R | OS_OTH_W
        OS_OTH_RWX = OS_OTH_RW | OS_OTH_X

        OS_ALL_R = OS_USER_R | OS_GROUP_R | OS_OTH_R
        OS_ALL_W = OS_USER_W | OS_GROUP_W | OS_OTH_W
        OS_ALL_X = OS_USER_X | OS_GROUP_X | OS_OTH_X
        OS_ALL_RW = OS_ALL_R | OS_ALL_W
        OS_ALL_RWX = OS_ALL_RW | OS_GROUP_X
)
Run Code Online (Sandbox Code Playgroud)

这允许我直接指定我的意图:

        // Create any directories needed to put this file in them
        var dir_file_mode os.FileMode
        dir_file_mode = os.ModeDir | (OS_USER_RWX | OS_ALL_R)
        os.MkdirAll(dir_str, dir_file_mode)
Run Code Online (Sandbox Code Playgroud)

我确信这可以通过使用iota和更多权限组合来改进,但它现在适用于我.

  • 克里斯这是非常有用的,这个2年+旧问题仍在观察/更新的事实表明需要在stdlib中提供常量. (11认同)

Jim*_*imB 27

FileMode只是一个uint32.http://golang.org/pkg/os/#FileMode

通过常量设置不是"作弊",你像其他数值一样使用它.如果您没有使用常量,则可以对有效数值使用转换:

mode := int(0777)
os.FileMode(mode)
Run Code Online (Sandbox Code Playgroud)

  • 除非我错了,如果你想要一些可写的文件而不是一些文件,这没有用.人们可以拥有或在(例如)0200打开用户可写,但如果有一个os常量来控制它,它将有助于代码可读性.是的,我希望每个程序员都值得知道八进制unix权限,但是当使用描述性名称时,使用魔术值仍然是不好的编程.据我所知,标准库缺少这个,只是希望每个人都记住Unix文件权限常量. (4认同)
  • @Ben ‘0755’ 是八进制,等于十进制的 ‘493’。 (2认同)