我研究了几个问题,但我找到的答案都没有帮助。此函数的目标是修改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窗体项目。
答案 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;
}