XmlDocument Save сохраняет файл открытым - PullRequest
10 голосов
/ 17 февраля 2012

У меня есть простая функция c #, которая создает основной файл XML и сохраняет:

private void CreateXMlFile(string Filename, string Name, string Company)
        {
            XmlDocument doc = new XmlDocument();
            XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
            doc.AppendChild(docNode);

            XmlNode licenseNode = doc.CreateElement("license");
            doc.AppendChild(licenseNode);

            XmlNode node = doc.CreateElement("Name");
            node.AppendChild(doc.CreateTextNode(Name));
            licenseNode.AppendChild(node);

            node = doc.CreateElement("Company");
            node.AppendChild(doc.CreateTextNode(Company));
            licenseNode.AppendChild(node);


            doc.Save(Filename);
        }

Когда я пытаюсь отредактировать или удалить файл, я всегда получаю следующую ошибку:

Процесс не может получить доступ к файлу, потому что он используется другим процесс.

XmlDocument не имеет встроенных процедур удаления или закрытия, и удивлялся, как я могу принудительно закрыть файл перед последующим редактированием или удалением.

Я попытался сохранить файл с помощью StreamWriter:

StreamWriter outStream = System.IO.File.CreateText(outfile);
            outStream.Write(data);
            outStream.Close();

Но это не имеет значения с той же ошибкой.

Ваш совет очень принят.

Спасибо

Ответы [ 2 ]

6 голосов
/ 17 февраля 2012

Отправка потока в метод сохранения XmlDocument вместо имени файла.

    private static void Main(string[] args)
    {
        CreateXMlFile("c:\\test.xml", "testName", "testCompany");
    }

    private static void CreateXMlFile(string Filename, string Name, string Company)
    {
        XmlDocument doc = new XmlDocument();
        XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null);
        doc.AppendChild(docNode);

        XmlNode licenseNode = doc.CreateElement("license");
        doc.AppendChild(licenseNode);

        XmlNode node = doc.CreateElement("Name");
        node.AppendChild(doc.CreateTextNode(Name));
        licenseNode.AppendChild(node);

        node = doc.CreateElement("Company");
        node.AppendChild(doc.CreateTextNode(Company));
        licenseNode.AppendChild(node);
        StreamWriter outStream = System.IO.File.CreateText(Filename);

        doc.Save(outStream);
        outStream.Close();
    }

Я попытался выполнить приведенный выше код, и он отлично работает на моем конце.

2 голосов
/ 17 февраля 2012

Ваш код в порядке.Я проверил его на своей машине, и после Save () не осталось блокировки.

Попробуйте использовать Unlocker (http://www.softpedia.com/get/System/System-Miscellaneous/Unlocker.shtml), чтобы проверить, действительно ли вы тот, кто держит блокировку.

Какой .NET Framework вы используете? Есть также отчет (http://bytes.com/topic/net/answers/467028-xmldocument-save-does-not-close-file-properly), которыйне воспроизводился тоже.

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