【问题标题】:XmlDocument Save keeps file openXmlDocument Save 保持文件打开
【发布时间】:2012-03-08 18:09:20
【问题描述】:

我有一个简单的 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();

但这对同样的错误没有影响。

您的建议被广泛接受。

谢谢

【问题讨论】:

  • 您是否尝试过使用流写入实例而不是传递文件名来保存?
  • 我遇到了同样的问题,但如果 XML 存在,我的代码会先加载它。 XmlReader 对象需要在文件上的锁被释放之前关闭。

标签: c# xml xmldocument


【解决方案1】:

将 Stream 发送到 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();
    }

我尝试执行上面的代码,最后它运行良好。

【讨论】:

  • 我试过这个,当我去删除文件时,我得到了同样的错误。
  • 您可以尝试更改文件位置吗?
  • 也尝试了新的位置,并且相同。我还禁用了 Livedrive(在线备份)以防干扰。
  • 这个问题已经困扰了我好几天了,因为 XMLDocument.Save() 在调试模式下似乎可以正确刷新,但是在 Release 下却没有。使用 Stream 解决了这个问题,谢谢。
  • 你最终弄明白了吗?我目前有同样的问题。
【解决方案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 和同样的问题。
  • 你能用按钮点击调用的方法创建一个空白项目并在点击后检查文件是否被锁定?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 2011-04-24
  • 2013-07-31
  • 1970-01-01
  • 2015-06-07
相关资源
最近更新 更多