Golang:将封送处理xml写入文件

Golang:将封送处理xml写入文件,xml,intellij-idea,go,Xml,Intellij Idea,Go,我有一个编组XML的字节数组,如果我使用os库将其写入文件: fh, _ := os.OpenFile("filename", os.O_CREATE, 0644) _, err := fh.Write(XMLByteArray) 我在文件末尾收到了一堆垃圾,好像这是一个糟糕的写入: <project version="4"> <component name="test"> <option name="urls"> <list&

我有一个编组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>
我得到了正确的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.OpenFile("filename", os.O_CREATE | os.O_TRUNC, 0644)
    
    或使用

    这基本上就是iotuil.WriteFile所做的(请参阅)


    如果IntelliJ没有足够的权限,它可能无法打开该文件。尝试在代码中将权限更改为0666,并检查是否使用这些权限创建了文件。注意:如果文件已存在,则忽略权限参数。此外,创建文件时设置的权限可能会受到进程的限制。

    OpenFile
    调用中,文件已存在,正在重新打开且未被截断。写入的数据小于文件的内容,因此只覆盖文件的开头,在结尾留下垃圾

    根据,您可以在打开时截断文件:

    os.OpenFile("filename", os.O_CREATE | os.O_TRUNC, 0644)
    
    或使用

    这基本上就是iotuil.WriteFile所做的(请参阅)


    如果IntelliJ没有足够的权限,它可能无法打开该文件。尝试在代码中将权限更改为0666,并检查是否使用这些权限创建了文件。注意:如果文件已存在,则忽略权限参数。另外,创建文件时设置的权限可能会受到流程的限制。

    这基本上就是修复方法,我选择了
    os.O_CREATE | os.O_TRUNC | os.O_RDWR
    作为我的文件模式,效果很好。至于IntelliJ问题,我只是有糟糕的XML;没有很好的记录。谢谢这基本上就是修复方法,我使用了
    os.O_CREATE | os.O_TRUNC | os.O_RDWR
    作为我的文件模式,效果很好。至于IntelliJ问题,我只是有糟糕的XML;没有很好的记录。谢谢