go操作文件

2021-08-09  本文已影响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
}
上一篇 下一篇

猜你喜欢

热点阅读