当前位置: 首页 > news >正文

GO系列-IO 文件操作

os io

判断文件是否存在

func fileExist(filePath string) (bool, error) {
    _, err := os.Stat(filePath)
    if err == nil {
       return true, nil
    }

    if os.IsNotExist(err) {
       return false, nil
    }
    return false, &CheckFileExistError{filePath}
}

读取文件内容

func readFileContext(file *os.File) (string, error) {
    if file == nil {
       return "", nil
    }

    var buf [1024]byte
    var content []byte
    for {
       n, err := file.Read(buf[:])
       if err == io.EOF {
          //结尾
          break
       } else if err != nil {
          log.Println("Read file error", file.Name())
          return "", err
       }

       content = append(content, buf[:n]...)
    }
    return string(content), nil
}

创建文件&写入文件内容

// 如果不存在 则创建
if !exist {
    log.Println("create file:", filePath)
    newFile, err := os.Create(filePath)
    if err != nil {
       log.Panicln(err.Error())
    }
    // 写入文件
    newFile.WriteString("Hello word !!!\n")
    newFile.Write([]byte("happy every day\n"))
    newFile.Close()
}

打开文件

// 打开这个文件
file1, err := os.Open(filePath)
if err != nil {
    log.Panicln(err.Error())
}

关闭和删除文件

// 删除前关闭文件,否则报错
file1.Close()

// 删除文件
stat1, _ := file1.Stat()
if stat1 != nil {
    log.Println("file is not closed")
}
err = os.Remove(filePath)
if err != nil {
    log.Println("remove file error", filePath, err.Error())
}
log.Println("remove file success", filePath)

copy文件

func copyFile(filePath1 string, filePath2 string) error {
    exist, err := fileExist(filePath1)
    if err != nil {
       return err
    }

    if !exist {
       log.Println("file1 must exist ")
       return nil
    }

    file1, err := os.Open(filePath1)
    if err != nil {
       log.Println("open file1 error")
       return err
    }
    defer file1.Close()

    // 如果存在则删除
    exist, err = fileExist(filePath2)
    if err != nil {
       return err
    }
    if exist {
       os.Remove(filePath2)
    }

    file2, err := os.Create(filePath2)
    if err != nil {
       log.Println("create file2 error")
       return err
    }
    defer file2.Close()

    var buffer [1024]byte
    for {
       n, err := file1.Read(buffer[:])
       if err == io.EOF {
          log.Println("copy complete")
          break
       }
       if err != nil {
          log.Println("copy error")
          return err
       }
       file2.Write(buffer[:n])
    }

    return nil
}

综合示例

package main

import (
    "io"
    "log"
    "os"
)

type CheckFileExistError struct {
    FilePath string
}

func (err CheckFileExistError) Error() string {
    return "Check File[" + err.FilePath + "] Exist Error"
}

func fileExist(filePath string) (bool, error) {
    _, err := os.Stat(filePath)
    if err == nil {
       return true, nil
    }

    if os.IsNotExist(err) {
       return false, nil
    }
    return false, &CheckFileExistError{filePath}
}

func readFileContext(file *os.File) (string, error) {
    if file == nil {
       return "", nil
    }

    var buf [1024]byte
    var content []byte
    for {
       n, err := file.Read(buf[:])
       if err == io.EOF {
          //结尾
          break
       } else if err != nil {
          log.Println("Read file error", file.Name())
          return "", err
       }

       content = append(content, buf[:n]...)
    }
    return string(content), nil
}

func copyFile(filePath1 string, filePath2 string) error {
    exist, err := fileExist(filePath1)
    if err != nil {
       return err
    }

    if !exist {
       log.Println("file1 must exist ")
       return nil
    }

    file1, err := os.Open(filePath1)
    if err != nil {
       log.Println("open file1 error")
       return err
    }
    defer file1.Close()

    // 如果存在则删除
    exist, err = fileExist(filePath2)
    if err != nil {
       return err
    }
    if exist {
       os.Remove(filePath2)
    }

    file2, err := os.Create(filePath2)
    if err != nil {
       log.Println("create file2 error")
       return err
    }
    defer file2.Close()

    var buffer [1024]byte
    for {
       n, err := file1.Read(buffer[:])
       if err == io.EOF {
          log.Println("copy complete")
          break
       }
       if err != nil {
          log.Println("copy error")
          return err
       }
       file2.Write(buffer[:n])
    }

    return nil
}

func main() {
    log.Println("main ...")

    filePath := "./test.txt"
    filePath2 := "./test2.txt"

    exist, err := fileExist(filePath)
    log.Println("file ", filePath, "exist:", exist)
    if err != nil {
       log.Println(err.Error())
    }

    // 如果不存在 则创建
    if !exist {
       log.Println("create file:", filePath)
       newFile, err := os.Create(filePath)
       if err != nil {
          log.Panicln(err.Error())
       }
       // 写入文件
       newFile.WriteString("Hello word !!!\n")
       newFile.Write([]byte("happy every day\n"))
       newFile.Close()
    }

    // 打开这个文件
    file1, err := os.Open(filePath)
    if err != nil {
       log.Panicln(err.Error())
    }

    // 读取文件原始内容
    context, err := readFileContext(file1)
    if err != nil {
       log.Panicln(err.Error())
    }
    log.Println("context:", context)

    // 删除前关闭文件,否则报错
    file1.Close()

    // copy文件
    copyFile(filePath, filePath2)

    // 删除文件
    stat1, _ := file1.Stat()
    if stat1 != nil {
       log.Println("file is not closed")
    }
    err = os.Remove(filePath)
    if err != nil {
       log.Println("remove file error", filePath, err.Error())
    }
    log.Println("remove file success", filePath)

    log.Println("success ..")
}

bufio

bufio包实现了带缓冲区的读写,是对文件读写的封装

bufio缓冲写数据

模式       含义

os.O_WRONLY     只写

os.O_CREATE      创建文件

os.O_RDONLY      只读

os.O_RDWR   读写

os.O_TRUNC 清空

os.O_APPEND      追加

package main

import (
    "bufio"
    "io"
    "log"
    "os"
)

// 写文件
func write(filePath string) {
    // 参数2:打开模式,所有模式d都在上面
    // 参数3是权限控制
    // w写 r读 x执行   w  2   r  4   x  1
    file, err := os.OpenFile(filePath, os.O_CREATE|os.O_WRONLY, 0666)
    if err != nil {
       return
    }
    defer file.Close()
    // 获取writer对象
    writer := bufio.NewWriter(file)
    for i := 0; i < 10; i++ {
       writer.WriteString("hello\n")
    }
    // 刷新缓冲区,强制写出
    writer.Flush()
}

// 读取文件
func read(filePath string) string {
    file, err := os.Open(filePath)
    if err != nil {
       return ""
    }
    defer file.Close()
    var content []byte
    reader := bufio.NewReader(file)
    for {
       line, _, err := reader.ReadLine()
       if err == io.EOF {
          break
       }
       if err != nil {
          return ""
       }
       content = append(content, []byte(string(line)+"\n")...)
    }
    return string(content)
}

func main() {
    log.Println("main ...")

    filePath := "./test1.txt"
    write(filePath)
    content := read(filePath)
    log.Println(content)

    log.Println("success ..")
}

ioutil

package main

import (
    "io/ioutil"
    "log"
)

func main() {
    log.Println("main ...")

    filePath := "./test1.txt"
    // 写文件
    err := ioutil.WriteFile(filePath, []byte("hello word"), 0666)
    if err != nil {
       log.Println(err)
       return
    }

    // 读取文件
    content, err := ioutil.ReadFile(filePath)
    if err != nil {
       log.Println(err)
       return
    }
    log.Println(string(content))

    log.Println("success ..")
}

控制台输入输出

终端其实是一个文件,相关实例如下:

os.Stdin:标准输入的文件实例,类型为*File

os.Stdout:标准输出的文件实例,类型为*File

os.Stderr:标准错误输出的文件实例,类型为*File

以文件的方式操作终端:

package main

import (
    "log"
    "os"
)

func main() {
    log.Println("main ...")

    var buf [16]byte
    // 从控制台读取一行数据
    os.Stdin.Read(buf[:])
    log.Println("read context:", string(buf[:]))

    // 写入到控制台
    os.Stdout.WriteString("hello word\n")

    log.Println("success ..")
}

相关文章:

  • 第三章 STM32 IIC驱动
  • 模电知识点总结(6)
  • 【后端】gitHub访问速度太慢解决办法
  • 特斯拉吹哨,自动驾驶端到端重写具身智能
  • 播放器系列1——总概述
  • uni-app(位置1)
  • 设计模式教程:解释器模式(Interpreter Pattern)
  • 高斯积分的证明
  • Grok 3.0 Beta 版大语言模型评测
  • 理解 logits_to_keep = logits_to_keep + 1 在 _get_per_token_logps 中的作用
  • 么是静态住宅IP,跨境电商为什么需要静态住宅IP
  • 杨校老师课堂之信息学奥赛结构体操作使用经典题集锦汇总
  • 力扣LeetCode: 2209 用地毯覆盖后的最少白色砖块
  • Linux C 静态库如何生成并使用
  • Javascript使用Sodium库实现 aead_xchacha20poly1305_ietf加密解密,以及与后端的密文交互
  • Web 自动化测试提速利器:Aqua 的 Web Inspector (检查器)使用详解
  • MySQL 选择数据库
  • SQL Server 创建用户并授权
  • 【算法基础】--前缀和
  • Spring全面讲解(无比详细)
  • 首次带人形机器人走科技节红毯,傅利叶顾捷:没太多包袱,很多事都能从零开始
  • 高途一季度净利润同比增长1108%: “与吴彦祖一起学英语”短时间内就实现了盈利
  • 小雨伞保险经纪母公司手回集团通过港交所聆讯
  • 美官方将使用华为芯片视作违反美出口管制行为,外交部回应
  • 吉利汽车一季度净利润大增264%,称整合极氪后实现整体效益超5%
  • 党建评:对违规宴饮等问题要坚决露头就打