美文网首页
go操作文件

go操作文件

作者: 彳亍口巴 | 来源:发表于2021-08-09 19:49 被阅读0次

将数据写到文件里面

假设内存里面的数据是一个map,go可以判断当前文件夹是否存在,若不存在可以创建,也可以判断当前文件是否存在,若不存在可以创建,创建好文件之后,我们可以将数据序列化,并写到文件中,可以是覆盖之前的数据,也可以是append追加

// SaveData 分为两个文件保存,一个保存全部的数据,一个保存当前的数据
func (c *cache) SaveData(path ...string) error {
    var (
        file       *os.File
        nowFile    *os.File
        nowFileErr error
        err        error
    )

    if len(path) > 1 {
        fmt.Println("只能传入一个路径")
        return fmt.Errorf("只能传入一个路径")
    } else if len(path) == 1 {
        // 判断路径是否存在,否则创建路径
        if _, err := os.Stat(path[0]); os.IsNotExist(err) {
            // 创建
            err = os.MkdirAll(path[0], os.ModePerm)
            if err != nil {
                fmt.Printf("os.MkdirAll callee failed:%+v", err)
                return err
            }
        }
        nowFile, nowFileErr = os.OpenFile(fmt.Sprintf("%s\\%s.log", path[0], "nowData"), os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600) // 覆盖
        file, err = os.OpenFile(fmt.Sprintf("%s\\%s.log", path[0], "allData"), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)          // 追加
    } else {
        nowFile, nowFileErr = os.OpenFile(fmt.Sprintf("%s.log", "nowData"), os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600)
        file, err = os.OpenFile(fmt.Sprintf("%s.log", "allData"), os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600)
    }

    if nowFileErr != nil {
        fmt.Printf("os.OpenFile callee failed:%+v", err)
        return err
    }
    if err != nil {
        fmt.Printf("os.OpenFile callee failed:%+v", err)
        return err
    }
    defer nowFile.Close()
    defer file.Close()
    c.rw.RLock()
    defer c.rw.RUnlock()
    // 对数据编码
    content, _ := json.Marshal(c.items)
    _, _ = file.Write([]byte(time.Now().Format(TIME_FORMAT)))
    _, _ = file.Write(content)
    _, _ = file.Write([]byte("\n"))
    // 当前数据
    _, _ = nowFile.Write(content)
    fmt.Println("数据写结束")
    return nil
}

将文件里面的数据加载到内存里面

// LoadFile 加载文件里面的数据到内存中
func (c *cache) LoadFile(fileName string) error {
    items := map[string]Item{}
    datas, err := ioutil.ReadFile(fileName)
    if err != nil {
        fmt.Println("ioutil.ReadFile(fileName) error:", err)
        return err
    }
    err = json.Unmarshal(datas, &items)
    if err != nil {
        fmt.Println("反序列化失败:", err)
        return err
    }
    //
    c.rw.Lock()
    for k, v := range items {
        value, found := c.items[k]
        if !found || value.Expired() {
            c.items[k] = v
        }
    }
    c.rw.Unlock()
    return nil
}

相关文章

  • vscode使用指南(文件快速导航)

    编写文件操作 快速打开文件目录列表 go to Definition go to type definition ...

  • Golang 系统调用 syscall

    对于写后端语言来说的人,文件操作是很常见的。go对文件操作的支持非常的好。今天通过go中文件操作记录下syscal...

  • Go文件操作

    http://www.cnblogs.com/sevenyuan/archive/2013/02/28/29372...

  • go 文件操作

    File 建立File内存地址 打开文件 写文件 读文件 删除文件 判断文件是否存在 file写文件 file读文...

  • 49.超赞的 Go 语言 INI 文件操作

    超赞的 Go 语言 INI 文件操作

  • 《Go语言四十二章经》第三十一章 文件操作与IO

    《Go语言四十二章经》第三十一章 文件操作与IO 作者:李骁 31.1 文件系统 对于文件和目录的操作,Go主要在...

  • Golang 文件操作

    参考Golang文件操作整理golang中的文件读写 一、API 参考Go语言学习笔记(五)文件操作 1.os.F...

  • Go语言文件操作

    文件的打开和关闭 os包中提供了方法叫做Open,就是专门用于打开某一个文件的 注意点:如果文件不存在不会自动创建...

  • Go语言文件操作

    如何打开和关闭文件 在Go语言中的OS包提供了一个函数,叫做open,就是专门用来打开文件的 在Go语言中OS包中...

  • Go基础——文件操作

    目录操作 创建名称为name的目录,权限设置是perm,例如0777 根据path创建多级子目录,例如astaxi...

网友评论

      本文标题:go操作文件

      本文链接:https://www.haomeiwen.com/subject/tbftbltx.html