Golang 文件操作

Jackey Golang 2,696 次浏览 , 6条评论

读取文件(带缓冲区)

readFile.go

package main

import (
  "bufio"
  "fmt"
  "io"
  "os"
)

func main() {
  // 打开文件
  file, err := os.Open("/Users/jackey/Downloads/3.txt")
  if err != nil {
    fmt.Println("打开文件失败,", err)
  }

  // 当函数退出时,要及时关闭file
  defer file.Close()

  reader := bufio.NewReader(file)
  for {
    str, err := reader.ReadString('\n')
    if err == io.EOF { //io.EOF 表示文件的末尾
      break
    }
    fmt.Print(str)
  }
  fmt.Println("文件读取结束")
}

读取文件(不带缓冲区,适用于小文件)

readFile.go

package main

import (
  "fmt"
  "io/ioutil"
)

func main()  {
  // 使用ioutil.ReadFile一次性读取
  file := "/Users/jackey/Downloads/3.txt"
  content, err := ioutil.ReadFile(file)
  if err != nil {
    fmt.Println("文件读取失败", err)
  }

  // 把读取到的内容显示到终端
  fmt.Printf("%v", string(content))
  // 没有显式的open文件,因此也不需要显式的close文件
  // 文件的open和close被封装到ReadFile函数内部
}

创建文件并写入内容

file.go

package main

import (
  "bufio"
  "fmt"
  "os"
)

func main()  {
  filePath := "/Users/jackey/Downloads/1.txt"
  file, err := os.OpenFile(filePath, os.O_WRONLY | os.O_CREATE, 0666)
  if err != nil {
    fmt.Println("打开文件失败")
    return
  }

  // 及时关闭file句柄
  defer file.Close()

  str := "这里是写入内容,gopher.cc \n"
  // 写入时,使用带缓存的 *Writer, 对于批量写入提高写入效率
  writer := bufio.NewWriter(file)
  for i := 0; i < 5; i++ {
    writer.WriteString(str)
  }
  // 内容是先写入到缓存的,因此需要调用 Flush方法,将缓存数据真正写入到文件中
  writer.Flush()
}

OpenFile 几种打开文件方式的定义

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  // 如果可能,打开时清空文件
)

文件copy

package main

import (
  "bufio"
  "fmt"
  "io"
  "os"
)

func CopyFile(distFileName string, srcFileName string) (written int64, err error) {
  srcFile, err := os.Open(srcFileName)
  if err != nil {
    fmt.Println("open file err ", err)
  }
  defer srcFile.Close()

  // 通过srcFile 获取到 Reader
  reader := bufio.NewReader(srcFile)
  dstFile, err := os.OpenFile(distFileName, os.O_WRONLY | os.O_CREATE, 0666)
  if err != nil {
    fmt.Println("open file err ", err)
  }
  // 通过 dstFile 获取到 Writer
  writer := bufio.NewWriter(dstFile)
  defer dstFile.Close()

  return io.Copy(writer, reader)
}

func main()  {
  srcFile := "/Users/jackey/Downloads/1.jpg" //源文件
  dstFile := "/Users/jackey/Downloads/2.jpg" //copy后的文件
  _, err := CopyFile(dstFile, srcFile)
  if err != nil {
    fmt.Println("copy 失败 ", err)
  } else {
    fmt.Println("copy 成功")
  }
}

 

6条评论

  1. 多乐猫 2020年3月17日 下午3:32 回复

    golang,只是有书,从来没有用过

    • gopher 2020年3月17日 下午3:52 回复

      用用吧,你会爱上她的。

  2. 卢松松博客 2020年3月17日 下午4:15 回复

    祝你好运哈!

  3. dandan 2020年3月21日 下午9:33 回复

    大佬求go资料!谢谢~

    • gopher 2020年3月22日 上午10:21 回复

      已发邮件,请查收

  4. 今日新鲜事 2020年3月23日 上午12:45 回复

    文章不错支持一下吧

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Go