Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建后删除文件_C#_Asp.net_Winforms_File - Fatal编程技术网

C# 创建后删除文件

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(

我试图删除一个文件后,我创建它,但根本无法。 错误消息是进程仍在使用它。 我正在处理一个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);
     }
堆栈跟踪:

在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不会立即执行该作业。