美文网首页Golang学习专题
golang ioutil.WriteFile函数perm参数的

golang ioutil.WriteFile函数perm参数的

作者: CodingCode | 来源:发表于2019-04-02 11:12 被阅读436次

    golang ioutil.WriteFile函数perm参数的用法
    ioutil.WriteFile(..., perm os.FileMode)

    刚开始接触golang的文件API的时候,总是纳闷为什么在创建文件的时候需要显示的指定文件的perm属性,难道不能从系统的umask里面获取吗?

    实际上ioutil.WriteFile在创建新文件时,并不是直接使用参数perm的值,而是要和umask的值做合并的。把函数参数的值合并到当前umask的值,才是最终创建出来文件的perm属性。

    umask的含义

    • 某位是1时,则把这位的perm属性关闭(disable)
    • 某位是0时,则把这位的perm属性打开(enable)
       owner   group   other
    0 - rwx  -  rwx  -  rwx
    

    例如

    $ umask 0222  # 对owner, group,和other的写属性都关闭。
    $ umask 0124  # 对owner关闭读属性,对group关闭写属性,对other关闭读和写属性
    

    ioutil.WriteFile例子

    package main
    
    import (
        "fmt"
        "syscall"
        "io/ioutil"
    )
    
    func main() {
    
        syscall.Umask(0000)
    
        err := ioutil.WriteFile("a", []byte(""), 0777)
        if err != nil {
            fmt.Printf("ioutil.WriteFile failure, err=[%v]\n", err)
        }
    }
    
    • 例子1:0000 <-> 0777
      $ ls -l a
      -rwxrwxrwx 1 0 Apr 2 10:59 a

    umask为空,所以ioutil.WriteFile的perm属性就是最后的文件属性

    • 例子2:0777 <-> 0777
      $ ls -l a
      ---------- 1 0 Apr 2 10:59 a

    umask为0777,所以ioutil.WriteFile的perm属性全被disable掉了

    • 例子3:0000 <-> 0640
      $ ls -l a
      ---------- 1 0 Apr 2 10:59 a

    umask为0000,所以ioutil.WriteFile的perm属性就是最后的文件属性

    • 例子4:0640 <-> 0640
      $ ls -l a
      ---------- 1 0 Apr 2 10:59 a

    umask为0640,而ioutil.WriteFile的perm属性也是640,正好全部被关闭了,最后生成的文件没有任何属性。

    对已经存在的文件属性不受影响

    即ioutil.WriteFile在写文件时,如果目标文件已经存在,那么目标文件的perm属性不会被改动,即此时ioutil.WriteFile的参数perm会被忽略。

    为什么touch命令测试和想的不一致

    注意一点就明白了,touch命令使用的是0666的属性,它并没有给X(executable)属性置值,所以不管在umask中对executable位是否置1,touch命令就不能生成一个具有executable的文件。

    相关文章

      网友评论

        本文标题:golang ioutil.WriteFile函数perm参数的

        本文链接:https://www.haomeiwen.com/subject/epewbqtx.html