看了下go语言的标准库,最开始看了下io库想着看看go语言提供的函数如何实现文件的读写,粗略的看了下就想着使用go语言提供的方法读写文件试下吧。
读文件,示例:
package main
import (
"fmt"
"io/ioutil"
"os"
)
const (
FILE = "./test.txt"
)
//Read file
func main(){
fd,err := os.Open(FILE) //打开文件
if err != nil{
fmt.Println("open file error")
}
defer fd.Close()
len,err := fd.Seek(0,2)//获取文件长度
if err != nil{
fmt.Println("get len error")
}
strbyte := make([]byte,len)
fd.Seek(0,0) //移回指针到文件开头
fd.Read(strbyte) //读文件
fmt.Println(string(strbyte))
dat,err := ioutil.ReadFile(FILE) //直接读文件
if err != nil{
fmt.Println("Read file err")
}
fmt.Println(string(dat))
}
按照C语言的方式进行了文件的读写后,才发现Go语言提供了更方便的方法使用ioutil库中的ReadFile函数可直接读取函数。
写文件,示例:
//write file
func main(){
dstr := []byte("this is a test")
err := ioutil.WriteFile(FILE,dstr,0777)
if err != nil{
fmt.Println("write file err")
}
dstr := []byte("this is a test")
fd,err := os.OpenFile(FILE,os.O_APPEND,0777)
if err != nil{
fmt.Println("open file error")
}
defer fd.Close()
num,err := fd.Write(dstr)
if err != nil{
fmt.Println(err)
}
fmt.Println(num)
}
同样Go语言也提供了WriteFile函数直接写文件,但是在使用C的方式写文件的时候与C语言有一些小的差别。我们知道C语言在写文件时在使用open函数打开文件获取文件句柄时只需要两个参数(文件名,权限)而在Go语言中使用Open函数打开文件只有读的权限。然而我们可以使用os.OpenFile函数打开文件并附权限。Go语言还提供了Create函数创建可写文件。Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件,如果文件已存在会截断它(为空文件)。如果成功,返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。
权限说明:
O_RDONLY int = syscall.O_RDONLY // 只读
O_WRONLY int = syscall.O_WRONLY // 只写
O_RDWR int = syscall.O_RDWR // 读写
O_APPEND int = syscall.O_APPEND // 在文件末尾追加,打开后cursor在文件结尾位置
O_CREATE int = syscall.O_CREAT // 如果不存在则创建
O_EXCL int = syscall.O_EXCL //与O_CREATE一起用,构成一个新建文件的功能,它要求文件必须不存在
O_SYNC int = syscall.O_SYNC // 同步方式打开,没有缓存,这样写入内容直接写入硬盘,系统掉电文件内容有一定保证
O_TRUNC int = syscall.O_TRUNC // 打开并清空文件
ioutil.WriteFile函数向filename指定的文件中写入数据。如果文件不存在将按给出的权限创建文件,否则在写入数据之前清空文件。
权限说明:
const (
// The single letters are the abbreviations
// used by the String method's formatting.
ModeDir FileMode = 1 << (32 - 1 - iota) // d: is a directory
ModeAppend // a: append-only
ModeExclusive // l: exclusive use
ModeTemporary // T: temporary file (not backed up)
ModeSymlink // L: symbolic link
ModeDevice // D: device file
ModeNamedPipe // p: named pipe (FIFO)
ModeSocket // S: Unix domain socket
ModeSetuid // u: setuid
ModeSetgid // g: setgid
ModeCharDevice // c: Unix character device, when ModeDevice is set
ModeSticky // t: sticky
// Mask for the type bits. For regular files, none will be set.
ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice
ModePerm FileMode = 0777 // Unix permission bits
)