dry69034 2016-05-06 12:46
浏览 51

WriteFile中途取消

I am currently writing some identifiers to a file, last_imported.txt. Every time I have imported an identifier, I want the file to contain only that.

It looks like ioutil.WriteFile("last_import.txt", []byte(id), 0644) would do the job, however it randomly leaves the file empty without writing the new identifier when I cancel the job while running, simulating a sudden crash.

I suspect that whenever it leaves it empty, it's because f.write(data) is never reached.

func WriteFile(filename string, data []byte, perm os.FileMode) error {
    f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
    if err != nil {
        return err
    }
    n, err := f.Write(data)
    if err == nil && n < len(data) {
        err = io.ErrShortWrite
    }
    if err1 := f.Close(); err == nil {
        err = err1
    }
    return err
}

How do I make sure that the file will not be left empty?

  • 写回答

1条回答 默认 最新

  • dongquechan4414 2016-05-06 13:02
    关注

    You should Close() the file using defer. This would flush buffer to file system.

    See https://blog.golang.org/defer-panic-and-recover

    func WriteFile(filename string, data []byte, perm os.FileMode) error {
        f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
        if err != nil {
            return err
        }
    
        defer f.Close() // <-- ADD THIS to close file *************************
    
        n, err := f.Write(data)
        if err == nil && n < len(data) {
            err = io.ErrShortWrite
        }
        if err1 := f.Close(); err == nil {
            err = err1
        }
        return err
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料