在golang中截断文件

时间:2017-06-07 15:15:53

标签: go

截断文件时,似乎是在开头添加了额外的零字节:

configFile, err := os.OpenFile("./version.json", os.O_RDWR, 0666)
defer configFile.Close()
check(err)
//some actions happen here
configFile.Truncate(0)
configFile.Write(js)
configFile.Sync()

因此,该文件包含我在开头用0个字节部分写的内容。

如何在没有前导零的情况下截断并完全重写文件?

2 个答案:

答案 0 :(得分:11)

请参阅Truncate上的文档:

  

截断会更改文件的大小。 它不会改变I / O偏移。如果有错误,则其类型为* PathError。

所以你还需要在写之前寻找文件的开头:

configFile.Truncate(0)
configFile.Seek(0,0)

答案 1 :(得分:2)

在您可能只想截断文件的情况下,我想展示一种替代方法,那么以下是另一种选择:

func truncate(filename string, perm os.FileMode) error {
    f, err := os.OpenFile(filename, os.O_TRUNC, perm)
    if err != nil {
        return fmt.Errorf("could not open file %q for truncation: %v", filename, err)
    }
    if err = f.Close(); err != nil {
        return fmt.Errorf("could not close file handler for %q after truncation: %v", filename, err)
    }
    return nil
}