截断文件时,似乎是在开头添加了额外的零字节:
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
个字节部分写的内容。
如何在没有前导零的情况下截断并完全重写文件?
答案 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
}