我在创建文件后尝试删除文件,但根本无法删除。 错误消息是该进程仍在使用它。 我正在开发一个winform应用程序。
这是我的代码:
XmlDocument xmlDoc = new XmlDocument();
XmlDeclaration xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
xmlDoc.AppendChild(xmlDec);
XmlElement elmRoot = xmlDoc.CreateElement("testConfig");
xmlDoc.AppendChild(elmRoot);
GetConfigTags(xmlDoc, elmRoot, clientToken);
StreamWriter wText =
new StreamWriter(CommonCodeClass.configLocation + "EmailConfig.xml");
xmlDoc.Save(wText);
wText.Flush();
wText.Close();
wText.Dispose();
File.Delete(CommonCodeClass.configLocation + "EmailConfig.xml");
我也尝试了下面的代码,但是同样的错误,文件被另一个进程使用
try
{
File.Delete(CommonCodeClass.configLocation + "EmailConfig.xml");
}
catch //or maybe in finally
{
GC.Collect(); //kill object that keep the file. I think dispose will do the trick as well.
Thread.Sleep(500); //Wait for object to be killed.
File.Delete(CommonCodeClass.configLocation + "EmailConfig.xml"); //File can be now deleted
log.Error(CommonCodeClass.configLocation + "EmailConfig.xml" + " was deleted forcefully as it was being used by the process.");
}
我错过了任何地方的文件结束吗?
请帮忙。感谢。
这是getconfigtag的代码:它只是创建一个要在配置文件中应用的标记。
internal static void GetConfigTags(XmlDocument xmlDoc, XmlElement elmRoot, string clientToken)
{
// Username Element
XmlElement elmUsername = xmlDoc.CreateElement(CommonCodeClass.xml_Username);
XmlAttribute xaUsername = xmlDoc.CreateAttribute("val");
xaUsername.Value = "singleVal";
elmUsername.InnerXml = "";
elmUsername.Attributes.Append(xaUsername);
elmRoot.AppendChild(elmUsername);
}
堆栈跟踪:
at System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath) 在System.IO.File.Delete(字符串路径) at ShareMgmt.CommonCodeClass.EmailTheConfigFile(String userEmail,String clientToken)位于C:\ Users \ ddsds \ Documents \ Visual Studio 2008 \ Projects \ ShareMgmt \ Mgmt \ CommonCodeClass.cs:第756行 at ShareMgmt.UsersForm.btnConfigToAdmin_Click(Object sender,EventArgs e)位于C:\ Users \ ddsds \ Documents \ Visual Studio 2008 \ Projects \ ShareMgmt \ Mgmt \ UsersForm.cs:第1122行
答案 0 :(得分:4)
“我错过了任何地方的文件吗?”您可以通过使用'using'语句确定关闭文件。
XmlDocument xmlDoc = new XmlDocument();
XmlDeclaration xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
xmlDoc.AppendChild(xmlDec);
XmlElement elmRoot = xmlDoc.CreateElement("testConfig");
xmlDoc.AppendChild(elmRoot);
GetConfigTags(xmlDoc, elmRoot, clientToken);
using (StreamWriter wText = new StreamWriter(CommonCodeClass.configLocation + "EmailConfig.xml"))
{
xmlDoc.Save(wText);
wText.Flush();
}
File.Delete(CommonCodeClass.configLocation + "EmailConfig.xml");
此代码适用于我,但原始版本的变体也是如此,除此之外,我不太确定问题是什么。
<强>附录:强>
您的堆栈跟踪显示您正在尝试通过电子邮件发送XML文件。如果是这种情况,和你正在使用SmtpClient,你甚至不需要将XML文档写入文件。
MemoryStream memoryStream = new MemoryStream();
xmlDoc.Save(memoryStream);
// ...
mailMessage.Attachments.Add(
new Attachment(memoryStream, "EmailConfig.xml", "application/xml"));
答案 1 :(得分:4)
代码适用于我,但每次使用实现using的类的实例时,我都建议使用IDisposable语句。
另一件事:永远不要致电GC.Collect()
尝试强制GC为您进行清理。如果您正确处理了您的实例(使用using
关键字,您将不会忘记),那么GC不需要您告诉他该怎么做。
答案 2 :(得分:0)
xmlDoc仍然有文件句柄。
将创建文件的代码放在函数中,以便在删除时xmlDoc超出范围。您可能必须调用GC.Collect()。确定这也是我遇到的最大问题之一。
或者您可以将{}
放在代码周围而不将其放在函数中。您始终可以使用{}
制作不同的范围。
所以上面的代码变成:
// other preceeding code
{
XmlDocument xmlDoc = new XmlDocument();
XmlDeclaration xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
xmlDoc.AppendChild(xmlDec);
XmlElement elmRoot = xmlDoc.CreateElement("testConfig");
xmlDoc.AppendChild(elmRoot);
GetConfigTags(xmlDoc, elmRoot, clientToken);
StreamWriter wText =
new StreamWriter(CommonCodeClass.configLocation + "EmailConfig.xml");
xmlDoc.Save(wText);
wText.Flush();
wText.Close();
wText.Dispose();
}
File.Delete(CommonCodeClass.configLocation + "EmailConfig.xml");