分享
  1. 首页
  2. 文章

golang ioutil.WriteFile函数perm参数的用法

CodingCode · · 17908 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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的文件。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:CodingCode

查看原文:golang ioutil.WriteFile函数perm参数的用法

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
17908 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏