golang写文件OpenFile默认不会自动覆写

在golang中,写文件可以这样操作,先用OpenFile打开句柄,然后写入。

fd, err := os.OpenFile(fname, os.O_WRONLY|os.O_CREATE, os.ModePerm)

这个句柄是打开写模式并且如果文件不存在就创建,看起来没有任何问题,但事实上如果文件之前存在了,并且本次写入的内容少于之前的内容,文件的内容将会乱套。

原因是OpenFile打开的句柄必须显式地声明覆写文件,要不然它不会执行清空文件就直接写入新内容,如果本次内容较少,得到的将会是本次内容+上次内部的后面部分,也就是一个乱掉的文件。

解决办法是显式地声明 O_TRUNC,如下:

fd, err := os.OpenFile(dst, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, os.ModePerm)

2014年10月28日