【发布时间】:2017-07-18 22:32:45
【问题描述】:
我有一个字节 [] 流,我将其写入临时文件,然后将其发送到另一个方法,该方法将其附加到电子邮件中。然后我想删除临时文件夹。我使用的代码sn-p如下。
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] 进程无法访问文件“BlackBox.zip”,因为它正被另一个进程使用。
我仅在电子邮件方法完成处理后才删除目录。所以我不知道为什么该文件夹仍在处理中。任何指针将不胜感激。
我也无法访问 sendEmail 方法,所以我该如何解决这个问题....我可以将我的代码放在同步块或其他东西中
sendEmail 的 retun 类型是 void...我无法修改 sendEmail ,但是我看到它在发送电子邮件时有一个锁(dispatchEmailTask)......
lock (m_QueueLock) { m_DispatchEmailTasks.Enqueue (dispatchEmailTask);}
so 在我的代码中,我如何才能在删除文件之前等待它完成?
【问题讨论】:
-
你有没有在各种对象上调用过
Dispose方法? -
发送电子邮件不会解除对附件的保留。您需要处理附件对象。
-
IOException: The process cannot access the file 'file path' because it is being used by another process 的可能重复项。该问题的已接受答案中的示例与您的问题几乎相同 - 它应该对您非常有用。
-
问题可能出在
sendEmail。如果其他 cmets 中发布的提示没有帮助,请发布该代码。 -
如果不修改
sendEmail并正确处理附件,您将无法解决此问题。 那个方法包含错误,所以那个方法需要修复。
标签: c#