XDocument.Save () не может получить доступ к файлу - PullRequest
3 голосов
/ 22 ноября 2011

Надеюсь, что я мог бы получить некоторую помощь в решении проблемы, которая, кажется, нигде не может найти окончательного ответа.

Я добавляю данные в документ XML с использованием объекта XDocument, изатем перезаписывает существующий файл с помощью xDoc.save (path), но по какой-то причине при первом запуске кода выдается ошибка, даже если файл не используется каким-либо другим процессом.

* "процесс не может получить доступ к файлу "C: \ XXX \ XXXX \ Telemetry \ 2011_11_22.tlm, поскольку он используется другим процессом." *

Последующие итерации не вызывают проблемы.

Здесьмой код, который я использую с try / catch, удален для удобства чтения: -

XElement x = GenerateTelemetryNode(h); //Create a new element to append

            if (File.Exists(path))
            {
                if (xDoc == null)
                {
                    xDoc = XDocument.Load(new StreamReader(path));
                }
            }
            else
            {
                xDoc = new XDocument();
                xDoc.Add(new XElement("TSD"));
            }
            xDoc.Element("TSD").Add(x);
            xmlPath = path;
            xDoc.Save(path);

Я уверен, что есть очень простое объяснение этому.

Большое спасибо заранее за любые ответы.

Ответы [ 4 ]

3 голосов
/ 22 ноября 2011

Я ожидаю, что проблема в том, что StreamReader не был удален, и в этом случае он все равно будет прикреплен к документу.Я бы предложил использовать обертку создания StreamReader в предложении using, чтобы обеспечить его удаление сразу после загрузки документа:

 if (xDoc == null)
 {
        using (var sr = new StreamReader(path))
        {        
           xDoc = XDocument.Load(new StreamReader(sr));
        }
 }
1 голос
/ 22 ноября 2011
        if (File.Exists(path))
        {
            if (xDoc == null)
            {
                StreamReader stream = new StreamReader(path);
                using (stream)
                {
                    xDoc = XDocument.Load(stream);
                }
            }
        }
        else
        {
            xDoc = new XDocument();
            xDoc.Add(new XElement("TSD"));
        }
        xDoc.Element("TSD").Add(x);
        xmlPath = path;
        xDoc.Save(path);
1 голос
/ 22 ноября 2011

Используйте перегрузку XDocument.Load, которая принимает Uri (имя файла), а не поток.

0 голосов
/ 22 ноября 2011

Не могу проверить в данный момент, но я подозреваю, что StreamReader использует его, особенно если ваша первая итерация вызывает только это Исключение.Вы пробовали:

XElement x = GenerateTelemetryNode(h); //Create a new element to append

        if (File.Exists(path))
        {
            if (xDoc == null)
            {
                StreamReader reader = new StreamReader(path);
                xDoc = XDocument.Load(reader);
                reader.Close();
                reader.Dispose();
            }
        }
        else
        {
            xDoc = new XDocument();
            xDoc.Add(new XElement("TSD"));
        }
        xDoc.Element("TSD").Add(x);
        xmlPath = path;
        xDoc.Save(path);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...