Golang基础——文件的基础操作

130 阅读2分钟

一些文件操作的常量

const (
   // Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.
   O_RDONLY int = syscall.O_RDONLY // 只读
   O_WRONLY int = syscall.O_WRONLY // 只写
   O_RDWR   int = syscall.O_RDWR   // 读写
   // The remaining values may be or'ed in to control behavior.
   O_APPEND int = syscall.O_APPEND // 往后追加
   O_CREATE int = syscall.O_CREAT  // 创建文件,如果不存在
   O_EXCL   int = syscall.O_EXCL   // 文创建文件与create一起用,文件必须不存在
   O_SYNC   int = syscall.O_SYNC   // 同步IO操作
   O_TRUNC  int = syscall.O_TRUNC  // 清空文件
)

文件的读取操作

基本读取

读取同目录下的test.txt文件

func file() {
   file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_RDWR, 0777)
   defer file.Close()
   if err != nil{
      fmt.Println(err.Error())
      return
   }
   for {
      b := make([]byte,10)
      read, err := file.Read(b)
      if err != nil{
         return
      }
      fmt.Print(string(b[:read]))
   }
}

用带有缓存的reader读取

func file() {
   file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_RDWR, 0777)
   defer file.Close()
   if err != nil{
      fmt.Println(err.Error())
      return
   }

   reader:= bufio.NewReader(file)
   for {
      line, _, err := reader.ReadLine()
      if err != nil {
         return
      }
      fmt.Println(string(line))
   }
   
}

文件夹的读取

文件夹接口的封装

type DirEntry interface {
   Name() string
   IsDir() bool
   Type() FileMode
   Info() (FileInfo, error)
}

例子

读取当前目录下文件夹中的内容

func file() {
   dir, err := os.ReadDir("./")
   if err != nil {
      return
   }
   for _,v := range dir {
      fmt.Println(v.Info())
      fmt.Println(v.Name())
      fmt.Println(v.IsDir())
      fmt.Println(v.Type())
   }
}

结果部分截图如下:

image.png

文件的写操作

基本

向同目录下的test.txt文件末尾写入hello world

func file() {
   file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_RDWR, 0777)
   defer file.Close()
   if err != nil{
      fmt.Println(err)
      return
   }

   file.Seek(0,io.SeekEnd)
   file.Write([]byte("hello world"))

}

使用带有缓存的writer写

如下例子,将文件内容按行读取后,使用带有缓存的writer在文件末尾追加,并标注行号

func file() {
   file, err := os.OpenFile("./test.txt", os.O_CREATE|os.O_RDWR, 0777)
   defer file.Close()
   if err != nil {
      return
   }

   writer := bufio.NewWriter(file)
   reader := bufio.NewReader(file)
   n:=0

   for {
      line, _, err := reader.ReadLine()
      if err!=nil {
         break
      }
      n++
      writer.WriteString("\n" + strconv.Itoa(n) + " " +string(line))
   }

   writer.Flush()
}

Tip:

  • 在使用writer.WriteString()时,实际上是将内容写入了缓存,需要使用writer.Flush(),将内容刷新到文件中
  • 可以使用file.Seek(0,io.SeekStart)来将内容进行覆盖(将光标移到文件最开始)

文件的复制

调用io包中的方法进行实现,实际上只是从src文件中内容覆盖到目标文件中,若目标文件行大于源文件,多出来的行不变化

func file() {
   file1, _ := os.OpenFile("./test.txt", os.O_CREATE|os.O_RDWR, 0777)
   file2, _ := os.OpenFile("./testCopy.txt", os.O_CREATE|os.O_RDWR, 0777)
   defer file1.Close()
   defer file2.Close()
   io.Copy(file2,file1)
}

本文正在参加技术专题18期-聊聊Go语言框架