我目前正在为文件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
}
如何确保文件不会留空?
答案 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
}