image.png

OS & bufio

OS.File是一个结构体,其绑定了文件操作的所有相关函数 通过 file = os.OpenFile() 打开文件句柄 通过 bufio.newWriter/newReader(file) 打开缓冲读写器进行读写

打开和关闭文件

  1. // 打开关闭文件
  2. // 1 打开文件
  3. file, err := os.Open("./TestText/a1.txt")
  4. if(err != nil){
  5. fmt.Println("打开文件失败!!")
  6. }
  7. fmt.Println(file)
  8. // 2 关闭文件
  9. //err = file.Close()
  10. //if err != nil {
  11. // fmt.Println("关闭文件失败!!")
  12. //}
  13. defer file.Close()

读文件

  1. //读文件
  2. // 带缓冲区的读文件
  3. reader := bufio.NewReader(file) //带缓冲区的reader , 默认缓冲区为4096个字节
  4. for {
  5. str , err := reader.ReadString('\n') //分割读取字符串,读取到一个分隔符为止
  6. fmt.Print(str)
  7. //fmt.Println("-------")
  8. if err == io.EOF{ //读到了文件末尾 io.EOF表示文件末尾
  9. //fmt.Println("-------")
  10. break
  11. }
  12. }
  13. //fmt.Println("文件读取结束!")
  14. fmt.Println()
  15. //一次性读取,适合小文件 返回byte切片 content
  16. //不需要显式的打开和关闭文件
  17. content,_ := ioutil.ReadFile("./TestText/b.txt")
  18. fmt.Printf("%v",string(content))

写文件

os.OpenFile

image.png

  1. 第一个参数为文件路径
  2. 第二个参数为打开模式
  3. 第三个参数为文件的模式和权限位(Linux)(在windows操作系统中无效)
  4. 打开模式,可以通过|进行组合
  5. O_RDONLY int = syscall.O_RDONLY // 只读模式打开文件
  6. O_WRONLY int = syscall.O_WRONLY // 只写模式打开文件
  7. O_RDWR int = syscall.O_RDWR // 读写模式打开文件
  8. O_APPEND int = syscall.O_APPEND // 写操作时将数据附加到文件尾部
  9. O_CREATE int = syscall.O_CREAT // 如果不存在将创建一个新文件
  10. O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必须不存在
  11. O_SYNC int = syscall.O_SYNC // 打开文件用于同步I/O
  12. O_TRUNC int = syscall.O_TRUNC // 如果可能,打开时清空文件
  13. 文件模式
  14. // 单字符是被String方法用于格式化的属性缩写。
  15. ModeDir FileMode = 1 << (32 - 1 - iota) // d: 目录
  16. ModeAppend // a: 只能写入,且只能写入到末尾
  17. ModeExclusive // l: 用于执行
  18. ModeTemporary // T: 临时文件(非备份文件)
  19. ModeSymlink // L: 符号链接(不是快捷方式文件)
  20. ModeDevice // D: 设备
  21. ModeNamedPipe // p: 命名管道(FIFO)
  22. ModeSocket // S: Unix域socket
  23. ModeSetuid // u: 表示文件具有其创建者用户id权限
  24. ModeSetgid // g: 表示文件具有其创建者组id的权限
  25. ModeCharDevice // c: 字符设备,需已设置ModeDevice
  26. ModeSticky // t: 只有root/创建者能删除/移动文件
  27. // 覆盖所有类型位(用于通过&获取类型位),对普通文件,所有这些位都不应被设置
  28. ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice
  29. ModePerm FileMode = 0777 // 覆盖所有Unix权限位(用于通过&获取类型位)

代码演示

  1. //写文件
  2. //demo1 创建一个新文件写入内容5句子 "hello,Gardon"
  3. filePath := "./TestText/c.txt"
  4. //file3 , err := os.OpenFile(filePath,os.O_WRONLY |os.O_CREATE,0666)
  5. //for i:=0 ;i<5 ;i++ {
  6. // file3.WriteString("hello,Gardon\n")
  7. //}
  8. ////demo2
  9. //file4 , err := os.OpenFile(filePath,os.O_TRUNC | os.O_WRONLY,0666)
  10. //for i:=0 ;i<5 ;i++ {
  11. // file4.WriteString("大头娃娃\n")
  12. //}
  13. //
  14. ////demo3
  15. //file5 , err := os.OpenFile(filePath,os.O_APPEND | os.O_CREATE,0666)
  16. //for i:=0 ;i<5 ;i++ {
  17. // file5.WriteString("大瓷娃娃\n")
  18. //}
  19. //demo4 读+写
  20. file6 , err := os.OpenFile(filePath,os.O_RDWR,0666)
  21. defer file6.Close()
  22. InfoReader := bufio.NewReader(file6)
  23. for{
  24. str2 , err := InfoReader.ReadString('\n')
  25. fmt.Print(str2)
  26. if err == io.EOF{
  27. break
  28. }
  29. }
  30. for i:=0;i<5 ;i++ {
  31. file6.WriteString("BigShot\n" )
  32. }
  33. InfoWriter := bufio.NewWriter(file6) //使用带缓存的writer 或 reader优化
  34. for i:=0;i<5 ;i++ {
  35. InfoWriter.WriteString("BigShot\n" )
  36. }
  37. InfoWriter.Flush() //落盘

文件拷贝

  1. //文件拷贝(小文件)
  2. // 写入文件不存在时会自动创建,写入文件会清空之前内容
  3. filepath_c := "./TestText/c.txt"
  4. filepath_d := "./TestText/d.txt"
  5. data , err := ioutil.ReadFile(filepath_c)
  6. if err!=nil {
  7. //文件读取有误
  8. fmt.Printf("读取文件错误: %v\r\n",err)
  9. return
  10. }
  11. err = ioutil.WriteFile(filepath_d, data ,0666)
  12. if err != nil {
  13. fmt.Printf("写入文件错误:%v\r\n",err)
  14. }

利用 os.Copy() 进行文件拷贝

  1. // 文件拷贝,大文件
  2. func CopyFile(dstFilePath string, srcFilePath string)(written int64,err error){
  3. // 将文件从源路径拷贝到目标路径
  4. srcFile, err := os.Open(srcFilePath)
  5. if err!= nil {
  6. fmt.Printf("打开文件错误!%v\r\n",err)
  7. return
  8. }
  9. defer srcFile.Close()
  10. reader := bufio.NewReader(srcFile)
  11. dstFile ,err := os.OpenFile(dstFilePath , os.O_WRONLY | os.O_CREATE , 0666)
  12. if err!= nil{
  13. fmt.Printf("打开文件错误!%v\r\n",err)
  14. return
  15. }
  16. defer dstFile.Close()
  17. writer := bufio.NewWriter(dstFile)
  18. return io.Copy(writer,reader)
  19. }

判断文件是否存在

image.png

  1. func PathExists(path string)(bool,error){
  2. _,err := os.Stat(path)
  3. if err == nil { //文件或目录存在
  4. return true , nil
  5. }
  6. if os.IsNotExist(err){
  7. return false, nil
  8. }
  9. return false,err
  10. }