创建后删除文件

时间:2011-12-28 15:41:30

标签: 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("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行

3 个答案:

答案 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");