在C#中如何删除目录

时间:2017-07-17 18:24:36

标签: c#

我有一个byte []流,我将其写入临时文件,然后将其发送到另一个将其附加到电子邮件的方法。然后我想删除临时文件夹。我使用的代码片段如下。

 byte[] blackboxBytes = Convert.FromBase64String(backBoxBase64);
 uniqueTempFolder = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()));
 zipFilePath = Path.Combine(uniqueTempFolder.FullName, "BlackBox.zip");
 File.WriteAllBytes(zipFilePath, blackboxBytes);

 sendEmail (deviceFQN, message, ZipFilePath);
 s_Log.Warn("Email sent");

//recursive delete of the whole folder
 uniqueTempFolder.Delete(true);
 s_Log.Warn("In BB zipFilePath after delete");

当我运行时,电子邮件将被发送,我收到日志"电子邮件已发送"。但之后我收到一条错误消息,并且不删除临时目录。

  

IOError:[Errno 32]该进程无法访问文件&#3.; BlackBox.zip'因为它正被另一个进程使用。

我只在电子邮件方法完成处理后才删除目录。所以我不知道为什么文件夹仍在处理中。任何指针都将非常感激。

此外我无法访问sendEmail方法,所以如何解决这个问题....我可以把我的代码放在同步块中吗?

sendEmail的retun类型是无效的......我无法修改sendEmail,但我发现它在发送电子邮件时有一个锁定(dispatchEmailTask​​).......

lock (m_QueueLock) { m_DispatchEmailTasks.Enqueue (dispatchEmailTask);}

在我的代码中,我怎样才能在删除文件之前等待它完成?

2 个答案:

答案 0 :(得分:0)

没有办法做到这一点,因为sendEmail将电子邮件发送到队列,并且没有返回处理程序让我知道该操作是否已被竞争。所以最后我创建了一个每天运行清理文件的清理工作。

答案 1 :(得分:-2)

  

这是因为您正在使用通常位于内存中的Streams,并且通常使用锁来进行单个调用。这意味着您只能使用一次流,并且必须再次重新创建它,以防您想对文件或目录执行其他操作。

代码中的问题是当您将zip文件写入目录时,流不会被释放。 Using语句与StreamWriter System.IO下的 byte[] blackboxBytes = Convert.FromBase64String(backBoxBase64); var uniqueTempFolder = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), Path.GetRandomFileName())); var zipFilePath = Path.Combine(uniqueTempFolder.FullName, "BlackBox.zip"); using (StreamWriter writer = new StreamWriter(zipFilePath)) { writer.Write(blackboxBytes); } sendEmail(deviceFQN, message, ZipFilePath); s_Log.Warn("Email sent"); //recursive delete of the whole folder uniqueTempFolder.Delete(true); s_Log.Warn("In BB zipFilePath after delete"); 语句相结合,可以帮助您完成此操作,如下面的代码所示。

SSLContext sslContext = SSLContext.getInstance("TLS");