如果我使用os库将其写入文件,我有一个编组XML的字节数组:
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()
之间的区别是什么?答案 0 :(得分:2)
在OpenFile
调用中,该文件已存在且正在重新打开且未截断。写入的数据小于文件的内容,因此只覆盖文件的开头,最后留下垃圾。
根据os flags,您可以在打开时截断文件:
os.OpenFile("filename", os.O_CREATE | os.O_TRUNC, 0644)
或使用os.Create()。
这基本上就是iotuil.WriteFile正在做的事情(参见source)。
如果IntelliJ没有足够的权限,则可能无法打开该文件。尝试在代码中将权限更改为0666,并检查是否使用这些权限创建了文件。请注意,如果文件已存在,则忽略权限参数。此外,创建文件时设置的权限可能受进程的umask限制。