Go 文件读写

看了下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
)

你可能感兴趣的:(Go语言学习)