XmlDocument的保存会保持文件处于打开状态

12

我有一个简单的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没有任何内置的dispose或close例程,想知道如何强制在稍后编辑或删除之前关闭文件。

我已经尝试使用StreamWriter保存文件:

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

但这并没有改变同样的错误。

非常感谢您的建议。

谢谢。


你尝试过使用流写入的实例来编写它,而不是将文件名传递给保存吗? - Steve
我曾经遇到过相同的问题,但我的代码首先会加载存在的XML。在文件锁被释放之前,XmlReader对象需要被关闭。 - Arnold Pistorius
2个回答

7
将流发送到XmlDocument的Save方法而不是文件名。
    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();
    }

我尝试执行上面的代码,发现在我的电脑上运行良好。


我尝试了这个,但当我尝试删除文件时,出现了相同的错误。 - Belliez
你能试着改变文件位置吗? - AshokD
尝试了新地点,但结果相同。为了防止干扰,我也禁用了 Livedrive(在线备份)。 - Belliez
1
这个问题困扰了我几天,因为XMLDocument.Save()在调试模式下似乎可以正确刷新,但在发布模式下则不行。使用Stream解决了这个问题,谢谢。 - StuTheDog
你最终解决了吗?我目前也遇到了同样的问题。 - Ravid Goldenberg

2
您的代码没问题。我在我的电脑上测试过了,在Save()后没有保留锁定状态。
尝试使用 Unlocker (http://www.softpedia.com/get/System/System-Miscellaneous/Unlocker.shtml) 来检查您是否真的持有锁。
您使用哪个 .NET 框架?还有一个报告 (http://bytes.com/topic/net/answers/467028-xmldocument-save-does-not-close-file-properly) 也无法重现。

它被Visual Studio vshost.exe锁定了。我刚刚编译到了.NET 3.5,但问题仍然存在。 - Belliez
你能否创建一个空项目,并通过按钮点击调用该方法,然后在点击后检查文件是否被锁定? - BlueM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接