我目前正在向文件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
}如何确保文件不会留空?
发布于 2016-05-06 21:02:12
您应该使用defer对文件执行Close()操作。这会将缓冲区刷新到文件系统。
请参阅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
}https://stackoverflow.com/questions/37072815
复制相似问题