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

本文解析了Golang中的ioutil.WriteFile函数中perm参数的用法,强调了它如何与umask结合决定文件权限,并通过实例展示了不同umask设置下文件权限的变化。重点在于新文件创建时权限的设定和已存在文件的权限保持不变。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值