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?

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
}