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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang ioutil.WriteFile函数perm参数的用法相关的知识,希望对你有一定的参考价值。

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

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

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

例如

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

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

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

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

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

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

Go的文件读写几种方法

Go的文件读写几种方法

整个文件:ioutil

// ReadFile: 返回[]byte
data, err := ioutil.ReadFile("f")
// WriteFile
err := ioutil.WriteFile("f", []byte(str), 0777)

文件指针:Open+Read+Write

f, err := os.Open("f")
check(err)
defer f.Close()
buf := make([]byte, 1024)
// Read: 读取数据长度由缓冲变量决定
// 还有ReadAt,增加参数off,Read相当于ReadAt(buf, 0)
count, err := f.Read(buf)
// Write,同样有WriteAt,Seek
count, err := f.Write(buf)

带缓存IO:bufio

w := bufio.NewWriter(os.Stdout)
fmt.Fprint(w, "Hello, ")
fmt.Fprint(w, "world!")
w.Flush() // Don‘t forget to flush!

f, err := os.Open("f")
check(err)
// 得到一个带缓存的新Reader
reader := bufio.NewReader(f)
// 得到一个带缓存的新Writer
writer := bufio.NewWriter(f)

以上是关于golang ioutil.WriteFile函数perm参数的用法的主要内容,如果未能解决你的问题,请参考以下文章

Golang basic_leaming文件目录操作

golang的io.copy使用

Go的文件读写几种方法

Go的文件读写几种方法

go语言读写文件的几种方式

[]byte数据保存成图片