如何删除c#中由xmlreader打开的文件?

时间:2013-02-05 23:08:00

标签: c# xml winforms xmlreader

我研究了几个问题,但我找到的答案都没有帮助。此函数的目标是修改xml文件。我阅读了原始文件,并将旧内容和新内容写入新文件。所有这一切都很完美。当我完成并需要删除旧文件并移动新文件时,问题就出现了。

收到的错误是另一个进程(读者文件)正在使用jnv_config.xml。

删除关闭和/或处理无法解决问题。

using (XmlReader reader = XmlReader.Create("jnv_config.xml"))
using (XmlWriter writer = XmlWriter.Create("jnv_temp.xml"))
{
    writer.WriteStartDocument();
    while (reader.Read())
    {
      // Read the file, write to the other file - this part works perfectly.
      // No filestreams nor anything else is created in here.
    }
    writer.WriteEndElement();
    writer.WriteEndDocument();
    reader.Close();
    writer.Close();
    reader.Dispose();
    writer.Dispose();
}
// Delete the old file and copy the new one
File.Delete("jnv_config.xml");
//File.Move("jnv_temp.xml", "jnv_config.xml");

我正在使用VS2012(NET 4.5),C#,标准Windows窗体项目。

3 个答案:

答案 0 :(得分:4)

你确定这个XmlReader仍然打开文件吗?在此代码执行之前,您是否尝试使用Process Explorer确认配置文件没有打开的文件句柄?

答案 1 :(得分:0)

根据我的经验,许多NTFS文件处理函数(尤其是DELETE)略有异步。尝试在RENAME之前添加睡眠或等待至少0.2秒。


由于这不起作用,我建议在之前放置Sleep / Wait ,然后慢慢增加它直到它工作。如果你达到一些不合理的大时间跨度(比如说10秒)并且它仍然不起作用,那么我认为你可以公平地得出结论,问题在于你只要留下XmlReader就不会被释放在这段代码中。

在这种情况下,您可能需要做一些事情以确保它完全处理完毕,例如强制GC运行。

答案 2 :(得分:0)

在删除文件之前检查文件是否准备就绪。如果您使用大型文件可能会通过循环调用代码几秒钟。

private void IsFileOpen(FileInfo file)
{
    FileStream stream = null;
    try {
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (Exception ex) {

        if (ex is IOException && IsFileLocked(ex)) {
            // do something here, either close the file if you have a handle or as a last resort terminate the process - which could cause corruption and lose data
        }
    }
}

private static bool IsFileLocked(Exception exception)
{
    int errorCode = Marshal.GetHRForException(exception) & ((1 << 16) - 1);
    return errorCode == 32 || errorCode == 33;
}