我有一个编码 XML 的字节数组,如果我使用 os 库将它写入文件:
fh, _ := os.OpenFile("filename", os.O_CREATE, 0644)
_, err := fh.Write(XMLByteArray)
我在文件末尾看到一堆垃圾,好像是写错了一样:
<project version="4">
<component name="test">
<option name="urls">
<list></list>
</option>
</component>
</project> </option>
</component>
</project>on>
</component>
</project>
如果我像这样使用 io/ioutil 库编写它:
err = ioutil.WriteFile("filename", XMLByteArray, 0644)
if err != nil {
log.Fatal(err)
}
我得到正确的 XML:
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="test">
<option name="urls">
<list></list>
</option>
</component>
</project>
这是我真的不明白的部分。该文件是动态路径生成的结果,是 IntelliJ 的配置。如果我使用 os.Write()
然后正确关闭文件处理程序,IntelliJ 会立即读取文件,但会出错,因为 XML 被弄乱了。如果我使用 ioutil.WriteFile()
写入文件,该文件看起来是正确的,但 IntelliJ 无法识别该文件是否存在。
所以我的问题是:
os.Write()
和ioutil.WriteFile()
有什么区别?- 为什么这种差异会导致字节数组的写入方式不同?
最佳答案
在 OpenFile
调用中,文件已经存在并且正在重新打开而不是被截断。写入的数据小于文件的内容,因此只覆盖文件的开头,最后留下垃圾。
根据 os flags您可以在打开时截断文件:
os.OpenFile("filename", os.O_CREATE | os.O_TRUNC, 0644)
或者使用os.Create() .
这基本上就是 iotuil.WriteFile 正在做的事情(参见 source )。
如果没有足够的权限,IntelliJ 可能无法打开该文件。尝试在代码中将权限更改为 0666,并检查文件是使用这些权限创建的。请注意,如果文件已存在,则忽略权限参数。此外,创建文件时设置的权限可能会受到 umask 的限制。的过程。
关于xml - 戈朗 : write marshal xml to file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38360026/