C# 创建后删除文件
我试图删除一个文件后,我创建它,但根本无法。 错误消息是进程仍在使用它。 我正在处理一个winform应用程序 这是我的密码:C# 创建后删除文件,c#,asp.net,winforms,file,C#,Asp.net,Winforms,File,我试图删除一个文件后,我创建它,但根本无法。 错误消息是进程仍在使用它。 我正在处理一个winform应用程序 这是我的密码: XmlDocument xmlDoc = new XmlDocument(); XmlDeclaration xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null); xmlDoc.AppendChild(xmlDec); XmlElement elmRoot = xmlDoc.CreateElement(
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);
}
堆栈跟踪:
在System.IO.\uuu Error.WinIOError(Int32 errorCode,字符串maybeFullPath)
在System.IO.File.Delete处(字符串路径)
在ShareMgmt.CommonCodeClass.EmailC:\Users\ddsds\Documents\Visual Studio 2008\Projects\ShareMgmt\Mgmt\CommonCodeClass.cs:第756行中的配置文件(字符串userEmail,字符串clientToken)
在ShareMgmt.UsersForm.btnConfigToAdmin_中,单击C:\Users\ddsds\Documents\Visual Studio 2008\Projects\ShareMgmt\Mgmt\UsersForm.cs:第1122行中的(对象发送方,事件参数e)
“我是否在任何地方丢失了文件关闭?”您可以确定使用“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"));
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");
代码对我来说是可行的,但我建议每次使用实现的类的实例时都使用该语句
另一件事:永远不要调用
GC.Collect()
来强制GC为您进行清理。如果您正确地处理实例(使用关键字,您不会忘记),那么GC就不需要您告诉他该做什么。GetConfigTags方法做什么?你也应该养成用块编码的习惯。这样,您就不必担心编写Dispose调用。您确定错误来自文件。删除行?它可能来自“new StreamWriter(…)”行吗?代码似乎适合我。请包括堆栈跟踪。此外,GC collect不会删除文件锁。一般来说,请使用
语句将IDisposable
对象(wText
)包装到中。然后对Flush()
、Close()
和Dispose()
的调用都可以消失。从堆栈跟踪判断,似乎您正在尝试通过电子邮件发送XML文件。是否正在使用MailMessage.Attachments.Add(…)?我想知道这是不是保留了引用。不要依赖变量的范围来判断实例是否为GCed。我们不知道GC什么时候做这项工作。就像我提到的-整个文件锁的情况是个问题,但是作用域应该从应用程序的角度移除锁。不。退出作用域实际上什么都不做。到达作用域结束后,GC不会立即执行该作业。