Go标准库 读写文件

创建一个空文件
package main
import (
  "log"
  "os"
)

func main() {
  file, err := os.Create("simpleyear.txt")
  if err != nil {
      log.Fatal("create file err", err)
  }
  log.Println(file)
  file.Close()
}

获取文件的信息


package main
import (
  "fmt"
  "log"
  "os"
)
func main() {
  fileInfo, err := os.Stat("simpleyear.txt")
  if err != nil {
      log.Fatal(err)
  }
  fmt.Println("File Name:", fileInfo.Name())
  fmt.Println("Size in bytes:", fileInfo.Size())
  fmt.Println("Permissions:", fileInfo.Mode())
  fmt.Println("Last modified:", fileInfo.ModTime())
  fmt.Println("Is Directory:", fileInfo.IsDir())
  fmt.Printf("System interface type:%T\v\n", fileInfo.Sys())
  fmt.Printf("System info:%+v\n\n", fileInfo.Sys())
}

重命名和移动文件


package main
import (
  "log"
  "os"
)
func main() {
  originalPath := "simpleyear.txt"
  newPath := "simpleyear_new.txt"
  err := os.Rename(originalPath, newPath)
  if err != nil {
      log.Fatal(err)
  }
}

删除文件
package main
import (
  "log"
  "os"
)
func main() {
  err := os.Remove("simpleyear.txt")
  if err != nil {
      log.Fatal(err)
  }
}

打开关闭文件


package main
import (
  "log"
  "os"
)
func main() {//简单的打开文件
  file, err := os.Open("simpleyear.txt")
  if err != nil {
      log.Fatal(err)
  }
  file.Close()
  file, err = os.OpenFile("simpleyear.txt", os.O_APPEND, 0666)
  if err != nil {
      log.Fatal(err)
  }
  file.Close()
}

打开文件的一些其他的操作
os.O_RDONLY     //只读
os.O_WRONLY     //只写
os.O_RDWR       //读写文件
os.O_APPEND     //追加文件
os.O_CREATE     //不存在时创建文件
os.O_TRUNC      //打开时截断文件

检查文件是否存在


package main
import (
  "log"
  "os"
)
var (
  fileInfo *os.FileInfo
  err      error
)
func main() {
  fileInfo, err := os.Stat("simpleyear.txt")
  if err != nil {
      if os.IsNotExist(err) {
          log.Fatal("File does not exist.")
      }
  }
  log.Println("File does exist.File information:")
  log.Println(fileInfo)
}

检查文件的读写权限


package main
import (
  "log"
  "os"
)
func main() {
  file, err := os.OpenFile("simpleyear.txt", os.O_WRONLY, 0666)
  if err != nil {
      if os.IsPermission(err) {
          log.Println("Error:Write permission denied.")
      }
  }
  file.Close()
  file, err = os.OpenFile("simpleyear.txt", os.O_RDONLY, 0666)
  if err != nil {
      if os.IsPermission(err) {
          log.Println("Error:Read permission denied.")
      }
  }
  file.Close()
}

改变文件的权限、所有权和时间戳


package main
import (
  "log"
  "os"
  "time"
)
func main() { //改变权限
  err := os.Chmod("simpleyear.txt", 0777)
  if err != nil {
      log.Println(err)
  }
  //改变所有权 适用于linux, windows不支持
  err = os.Chown("simpleyear.txt", os.Getuid(), os.Getegid())
  if err != nil {
      log.Println(err)
  }
  //改变时间戳
  twoDaysFromNow := time.Now().Add(48 * time.Hour)
  lastAccessTime := twoDaysFromNow
  lastModifyTime := twoDaysFromNow
  err = os.Chtimes("simpleyear.txt", lastAccessTime, lastModifyTime)
  if err != nil {
      log.Println(err)
  }
}

复制文件


package main
import (
  "io"
  "log"
  "os"
)
func main() {  
  originalFile, err := os.Open("simpleyear.txt")//打开原文件
  if err != nil {
      log.Fatal(err)
  }
  defer originalFile.Close()  
  newFile, err := os.Create("simpleyear_copy.txt")//创建新文件
  if err != nil {
      log.Fatal(err)
  }
  defer newFile.Close()
  bytes, err := io.Copy(newFile, originalFile) //文件复制
  if err != nil {
      log.Fatal(err)
  }
  log.Printf("Copied %d bytes.", bytes)
  err = newFile.Sync()
  if err != nil {
      log.Fatal(err)
  }
}

移动位置


package main
import (
  "fmt"
  "log"
  "os"
)
func main() {
  file, err := os.Open("simpleyear.txt")
  if err != nil {
      log.Fatal(err)
  }
  defer file.Close()
  var offset int64 = 5
  var whence int = 0
  newPos, err := file.Seek(offset, whence)
  if err != nil {
      log.Fatal(err)
  }
  fmt.Println("Just moved to 5:", newPos)
  newPos, err = file.Seek(-2, 1)
  if err != nil {
      log.Fatal(err)
  }
  fmt.Println("Just moved back two:", newPos)
  currentPos, err := file.Seek(0, 1)
  fmt.Println("current pos:", currentPos)
  newPos, err = file.Seek(0, 0)
  if err != nil {
      log.Fatal(err)
  }
  fmt.Println("position after seek 0,0:", newPos)
}

向文件中写入字节


package main
import (
  "log"
  "os"
)
func main() {
  file, err := os.OpenFile("simpleyear.txt", os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0666)
  if err != nil {
      log.Fatal(err)
  }
  defer file.Close()
  bytes := []byte("测试写入功能!")
  bw, err := file.Write(bytes)
  if err != nil {
      log.Fatal(err)
  }
  log.Printf("Wrote %d bytes.\n", bw)
}

快速写入文件


package main
import (
  "io/ioutil"
  "log"
)
func main() {
  err := ioutil.WriteFile("simpleyear.txt", []byte("测试快速写入功能!"), 0666)
  if err != nil {
      log.Fatal(err)
  }
}

在写入时使用缓存


package main
import (
  "bufio"
  "log"
  "os"
)
func main() {
  file, err := os.OpenFile("simpleyear.txt", os.O_WRONLY, 0666)
  if err != nil {
      log.Fatal(err)
  }
  defer file.Close()
  buffer := bufio.NewWriter(file)
  bw, err := buffer.Write([]byte{65, 66, 67})
  if err != nil {
      log.Fatal(err)
  }
  log.Printf("Bytes written:%d\n", bw)
  bw, err = buffer.WriteString("\n写入字符串")
  if err != nil {
      log.Fatal(err)
  }
  log.Printf("Bytes written: %d\n", bw)
  unFlushedBuffer := buffer.Buffered()
  log.Printf("Bytes buffered:%d\n", unFlushedBuffer)
  ba := buffer.Available()
  log.Printf("Available buffer: %d\n", ba)
  buffer.Flush()
  buffer.Reset(buffer)
  ba = buffer.Available()
  log.Printf("Availabled buffer:%d\n", ba)
  buffer = bufio.NewWriterSize(buffer, 8000)
  ba = buffer.Available()
  if err != nil {
      log.Fatal(err)
  }
  log.Printf("Available buffer: %d\n", ba)
}

从文件中读取n个字节


package main
import (
  "log"
  "os"
)
func main() {
  file, err := os.Open("simpleyear.txt")
  if err != nil {
      log.Fatal(err)
  }
  defer file.Close()  
  bytes := make([]byte, 16)//从文件中读取16个字节
  br, err := file.Read(bytes)
  if err != nil {
      log.Fatal(err)
  }
  log.Printf("number of bytes read: %d\n", br)
  log.Printf("Data read: %s\n", bytes)
}

读取文件中全部内容


data, err := ioutil.ReadAll(file) 快速读取文件到内存中

package main
import (
  "log"
  "io/ioutil"
)
func main() {
  data, err := ioutil.ReadFile("test.txt")
  if err != nil {
      log.Fatal(err)
  }
  log.Printf("Data read: %s\n", data)
}