首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WriteFile中途取消

WriteFile中途取消
EN

Stack Overflow用户
提问于 2016-05-06 20:46:19
回答 1查看 61关注 0票数 2

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

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

我怀疑,每当它保留为空时,都是因为从未访问过f.write(data)

代码语言:javascript
复制
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
}

如何确保文件不会留空?

EN

回答 1

Stack Overflow用户

发布于 2016-05-06 21:02:12

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

请参阅https://blog.golang.org/defer-panic-and-recover

代码语言:javascript
复制
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
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37072815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档