Закрыть экземпляр XDocument

Я проводил некоторые исследования по этому поводу, но все еще не мог это исправить. У меня есть эта функция:

private void AddNewService()
{
    string strPath = "ServicesToExecute.xml";
    string strServicename = tbNewService.Text;
    //try
    //{
        XDocument xdDocument;
        using (XmlReader xmlReader = XmlReader.Create(strPath))
        {
            xdDocument = XDocument.Load(xmlReader); 

            XElement root = new XElement("Service");
            root.Add(new XElement("Name", strServicename));
            xdDocument.Element("ServicesToExecute").Add(root);
            xmlReader.Close();
            xdDocument.Save(strPath);      
        }

И я получаю сообщение об ошибке при попытке сохранить файл... Есть идеи? Я думаю, что упускаю что-то очень, очень глупое, но пока не вижу этого.


person user3765774    schedule 23.06.2014    source источник
comment
Какое исключение выдается, когда вы получаете сообщение об ошибке?   -  person Haney    schedule 23.06.2014
comment
Почему бы не использовать перегрузку XDocument.Load, которая выбирает путь, вместо того, чтобы создавать XmlReader и закрывать ее самостоятельно?   -  person Mike Zboray    schedule 23.06.2014
comment
Исключением является необработанное исключение типа System.IO.IOException в System.xml.dll. Процесс не может получить доступ к файлу blablabla.xml, поскольку он используется другим процессом...   -  person user3765774    schedule 23.06.2014


Ответы (1)


Я полагаю, вы открываете файл с именем ServicesToExecute.xml внутри XmlReader, а затем пытаетесь сохранить XDocument по тому же пути... АКА пытается перезаписать файл, который вы открыли для чтения. Согласно @mikez выше, вам, вероятно, следует упростить свой код, используя перегрузку XDocument.Load(string path) как таковую:

private void AddNewService()
{
    string strPath = "ServicesToExecute.xml";
    string strServicename = tbNewService.Text;
    //try
    //{
        XDocument xdDocument = XDocument.Load(strPath);

        XElement root = new XElement("Service");
        root.Add(new XElement("Name", strServicename));
        xdDocument.Element("ServicesToExecute").Add(root);

        // Save
        xdDocument.Save(strPath);
person Haney    schedule 23.06.2014
comment
Извините.... не получилось убрать оператор сохранения из использования, ни закрыть... ммм... все еще занимаюсь исследованиями и пробую что-то... - person user3765774; 23.06.2014
comment
Сохраните в другой путь/имя файла или удалите использование XmlReader (см. мой обновленный ответ). - person Haney; 23.06.2014
comment
Нет .. извините .. тот же ответ ... он работал один раз .. и позже то же самое .. Кстати .. мне нужно обновить тот же файл ... пока я проверяю свои службы там и перезагружаю поле со списком - person user3765774; 23.06.2014