WriteFile在中途取消

时间:2016-05-06 12:46:19

标签: go

我目前正在为文件last_imported.txt写一些标识符。每次导入标识符时,我都希望文件只包含该标识符。

看起来ioutil.WriteFile("last_import.txt", []byte(id), 0644)可以完成这项工作,但是当我在运行时取消作业时,它会随机地将文件留空而不编写新标识符,模拟突然崩溃。

我怀疑只要它留空,就会因为f.write(data)永远不会到达。

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
}

如何确保文件不会留空?

1 个答案:

答案 0 :(得分:2)

您应该使用Close() defer该文件。这会将缓冲区刷新到文件系统。

请参阅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
}