Исключение памяти при XDocument.Save () - PullRequest
3 голосов
/ 13 января 2010

Я пытаюсь сохранить XDcoument на флэш-накопитель, на котором недостаточно свободного места.(Это специальное условие теста для приложения) Хотя приложение выдает исключение, как показано ниже, я не могу получить его в блоке try catch вокруг XDocument.Save (filePath).Похоже, это отложенный бросок.Это проблема LINQ или я делаю что-то не так?

1002 * alt text http://img211.imageshack.us/img211/8324/exce.png
 System.IO.IOException was unhandled
 Message="There is not enough space on the disk.\r\n"
 Source="mscorlib"
 StackTrace:
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count)
   at System.IO.FileStream.FlushWrite(Boolean calledFromFinalizer)
   at System.IO.FileStream.Dispose(Boolean disposing)
   at System.IO.FileStream.Finalize()

Ответы [ 4 ]

5 голосов
/ 14 января 2010

Вы нашли ошибку в фреймворке. XDocument.Save (string) использует инструкцию «using», чтобы обеспечить удаление выходного потока. Это зависит от кодировки, которую вы использовали в инструкции по обработке, но внутренний System.Xml.XmlUtf8RawTextReader был бы обычным для реализации средства записи текста.

Ошибка: программист Microsoft, написавший этот класс, забыл реализовать метод Dispose (). Реализован только метод Close ().

Довольно странно, что об этой ошибке еще не сообщалось на сайте обратной связи connect.microsoft.com. Это должно вызвать проблемы в общем использовании, потому что файл остается открытым, пока не завершится поток финализатора. Хотя обычно это не занимает много времени, пару секунд или около того. За исключением вашего случая, когда вы выходите из программы сразу после записи и, к сожалению, вам не хватает свободного места на диске в тот момент, когда буфер очищается.

Обходной путь для этой ошибки - вместо этого использовать перегрузку XDocument.Save (TextWriter), передавая StreamWriter, кодировка которого соответствует кодировке XML.

1 голос
/ 13 января 2010

Посмотрите на трассировку стека. Эта трассировка начинается с вызова Finalize, который выполняет Dispose, который выполняет FlushWrite, который вызывает WriteCore, который получает ошибку.

Другими словами, сначала очистите ваши данные.

Опубликуйте код, который вы используете для записи, и мы можем показать вам, где выполнить сброс.

0 голосов
/ 12 июня 2013

XDocument.Save(string) не содержит ошибок, он реализует метод Dispose. Заявление об использовании: - (как описано выше)

с использованием (XmlWriter writer = XmlWriter.Create(fileName, xmlWriterSettings)) this.Save(writer);

И XmlWriter имеет Dispose(), он реализует интерфейс IDisposable.

0 голосов
/ 13 января 2010

Вглядываясь в отражатель, последние несколько строк

 using (XmlWriter writer = XmlWriter.Create(fileName, xmlWriterSettings))
 {
     this.Save(writer);
 }

Это означает, что исключение выдается, когда писатель находится в распоряжении.
Я думаю, будет лучше проверить доступное дисковое пространство перед вызовом Save.

РЕДАКТИРОВАТЬ: Есть ли у вас Dispose d любой объект, от которого зависит экземпляр XDocument, перед вызовом Save?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...