2016-07-13 3 views
0

У меня есть массив байт сортируются, XML, если я пишу его в файл, используя библиотеку ОС:Golang: написать маршал 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> 

Если я пишу с гипергликемией/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 не распознает существующий файл.

Так что мои вопросы:

  1. В чем разница между os.Write() и ioutil.WriteFile()?
  2. Почему эта разница заставляет байтовый массив писать по-другому?

ответ

2

В вызове OpenFile файл уже существует и повторно открывается и не усекается. Записанные данные меньше, чем содержимое файла, поэтому перезаписывает только начало файла, оставляя мусор в конце.

По os flags вы можете обрезать файл при открытии:

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

Или используйте os.Create().

Это в основном то, что делает iotuil.WriteFile (см. source).

Возможно, IntelliJ не сможет открыть файл, если он не имеет достаточных разрешений. Попробуйте изменить права доступа к 0666 в коде и проверьте, что файл создан с этими разрешениями. Обратите внимание, что параметр разрешения игнорируется, если файл уже существует. Кроме того, разрешения, установленные при создании файла, могут быть ограничены umask процесса.

+0

Это было по существу исправление, я пошел с 'os.O_CREATE | os.O_TRUNC | os.O_RDWR' как мои режимы файлов, и это сработало просто отлично. Что касается проблемы IntelliJ, у меня просто был плохой XML; не задокументированы очень хорошо. Благодаря! – mxplusb

Смежные вопросы