go 文件读写操作
Posted sonfer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go 文件读写操作相关的知识,希望对你有一定的参考价值。
一、读文件操作
func FileRead(path string) { file, err := os.Open(path) if err != nil { fmt.Println("open file err=", err) } rb := make([]byte, 1024, 1024) for { n, err := file.Read(rb) if n == 0 || err == io.EOF { fmt.Println("jieshu") break } fmt.Println(string(rb[:n])) } err = file.Close() if err != nil { fmt.Println(err) } } func Bufio(path string) { file, err := os.Open(path) if err != nil { fmt.Println("open file err=", err) } defer file.Close() /* const ( defaultBufSize = 4096 //默认的缓冲区为4096 ) */ // 创建一个 *Reader ,是带缓冲区的 reader := bufio.NewReader(file) // 循环读取文件的内容 for { str, err := reader.ReadString(‘ ‘) //读到一个换行就结束 if err == io.EOF { // io.EOF 表示文件的末尾 break } // 输出内容 fmt.Println(str) } fmt.Println("文件读取结束!") } func IoUtil(path string) { // 使用ioutil.ReadFile 一次性将文件读取(不适合大文件操作) filestr, err := ioutil.ReadFile(path) // filestr类型[]byte if err != nil { fmt.Println("open file err=", err) } // 把文件内容读取到终端 fmt.Println(string(filestr)) // 没有打开和关闭文件句柄,因为两个操作都封装到ReadFile函数内部 }
二、写文件操作
func WriteHello(path string) { // 打开一个文件 /* const ( O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件 O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件 O_RDWR int = syscall.O_RDWR // 读写模式打开文件 O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部 O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件 O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在 O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件 ) */ // 打开或者创建一个文件 file, err := os.OpenFile(path, os.O_CREATE|os.O_CREATE, 0644) if err != nil { fmt.Println("open file err=", err) } defer file.Close() str := "hello,Sonfer! " // 写入时 使用带缓存的 *Writer writer := bufio.NewWriter(file) for i := 0; i < 5; i++ { writer.WriteString(str) } // 因为writer是带缓存,因此调用WriterString方法时, // 内容先写到缓存的,所以调用Flush方法,将缓冲数据 // 真实写入到文件中,否则文件中没有数据! writer.Flush() } func WriteAppend(path string) { // 打开文件时追加内容,如果是os.O_TRUNC则清空文件内容在写入 file, err := os.OpenFile(path, os.O_RDWR|os.O_APPEND, 0644) if err != nil { fmt.Println("open file err=", err) } defer file.Close() str := "追加的! " writer := bufio.NewWriter(file) for i := 0; i < 7; i++ { writer.WriteString(str) } writer.Flush() }
三、将一个文件内容写入到另一个文件中
package main import ( "bufio" "fmt" "io" "os" ) func ReadWrite(srcpaht, despath string) { rdfile, err := os.Open(srcpaht) if err != nil { fmt.Println("open rdfile err=", err) } rwfile, err := os.OpenFile(despath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) if err != nil { fmt.Println("open rwfile err=", err) } defer rdfile.Close() defer rwfile.Close() // 创建读写缓冲区 reader := bufio.NewReader(rdfile) writer := bufio.NewWriter(rwfile) for { // 缓冲区中读取行数 str, err := reader.ReadString(‘ ‘) if err == io.EOF { break } // 缓冲区中写文件 writer.WriteString(str) } fmt.Println("over!") } func main() { sorfile := "G:\GO\1.txt" desfile := "G:\GO\2.txt" ReadWrite(sorfile, desfile) }
四、判断一个文件是否存在
- 如果返回的错误为nil,说明文件或文件夹存在
- 如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在
- 如果返回的错误为其它类型,则不确定是否在存在
func PathExists(path string) (bool, error) { _, err := os.Stat(path) if err == nil { return true, nil } if os.IsNotExist(err) { return false, nil } return false, err }
以上是关于go 文件读写操作的主要内容,如果未能解决你的问题,请参考以下文章