Как заменить содержимое существующего XML-файла в C # .NET? - PullRequest
2 голосов
/ 15 января 2009

При попытке заменить содержимое файла XML в C # .NET на фрагмент, подобный следующему:

string file = Path.GetTempFileName(); // pretend this is a real file
string tmpFile = Path.GetTempFileName();

using (var writer = XmlWriter.Create(File.Create(tmpFile)))
{
    writer.WriteStartElement("root");
    for (int i = 0; i < 100; i++)
    {
        writer.WriteElementString("test", null, 
            "All work and no play makes Jack a dull boy");
    }
    writer.WriteEndElement();
}

File.Delete(file);
File.Move(tmpFile, file);

... Я получаю исключение System.IO.IOException, утверждающее, что файл уже открыт другим процессом.

Ответы [ 2 ]

7 голосов
/ 15 января 2009

По какой-то причине класс XmlWriter явно не располагает базовым потоком для временного файла. Помещение потока в собственное предложение «using» гарантирует, что поток будет закрыт правильно. Изменение кода на

string file = Path.GetTempFileName(); // pretend this is a real file
string tmpFile = Path.GetTempFileName();

using (var stream = File.Create(tmpFile))
using (var writer = XmlWriter.Create(stream))
{
    writer.WriteStartElement("root");
    for (int i = 0; i < 100; i++)
    {
        writer.WriteElementString("test", null, 
            "All work and no play makes Jack a dull boy");
    }
    writer.WriteEndElement();
}                
File.Delete(file);
File.Move(tmpFile,file);

... делает исключение IOException и работает как задумано.

4 голосов
/ 15 января 2009

Использование операторов может быть связано. Немного изменив свой код:

string file = Path.GetTempFileName(); // pretend this is a real file
string tmpFile = Path.GetTempFileName();

using (var stream = File.Create(tmpFile))
using (var writer = XmlWriter.Create(stream))
{
    writer.WriteStartElement("root");
    for (int i = 0; i < 100; i++)
    {
        writer.WriteElementString("test", null, 
            "All work and no play makes Jack a dull boy");
    }
    writer.WriteEndElement();
}                
File.Delete(file);
File.Move(tmpFile,file);

Если вы имеете дело с несколькими одноразовыми объектами в одной и той же области видимости (не редкость), это позволяет избежать гнусного глубокого вложения. :)

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