【问题标题】:In C# how to delete a directory在 C# 中如何删除目录
【发布时间】: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);}

s‌​o 在我的代码中,我如何才能在删除文件之前等待它完成?

【问题讨论】:

  • 你有没有在各种对象上调用过Dispose方法?
  • 发送电子邮件不会解除对附件的保留。您需要处理附件对象。
  • IOException: The process cannot access the file 'file path' because it is being used by another process 的可能重复项。该问题的已接受答案中的示例与您的问题几乎相同 - 它应该对您非常有用。
  • 问题可能出在sendEmail。如果其他 cmets 中发布的提示没有帮助,请发布该代码。
  • 如果不修改sendEmail 并正确处理附件,您将无法解决此问题。 那个方法包含错误,所以那个方法需要修复。

标签: c#


【解决方案1】:

无法执行此操作,因为 sendEmail 将电子邮件发送到队列,并且没有返回处理程序让我知道操作已完成。所以最后我创建了一个每天运行的清理作业来清理文件。

【讨论】:

    【解决方案2】:

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

    您的代码中的问题是,当您将 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");
    

    【讨论】:

    • Directory.CreateDirectory 不返回文件流,DirectoryInfo 不是一次性的。你对根本原因是对的,对实际解决方案是错误的。
    • 然后使用Using语句加上StreamWriter来解决问题。让我编辑我的答案,然后给你正确的答案。
    • 在编辑任何内容之前,请再次仔细阅读问题。您无法修改那里给出的代码,以便它做同样的事情并且摆脱锁定问题。这需要打开sendEmail
    • 请尝试并反馈您得到的结果。
    • 此代码将无法编译,因为StreamWriter.Write 不采用byte[]。在您离开并更改使用 aFileStream 之前,请不要打扰。 File.WriteAllBytes 已经这样做了,包括正确处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 2021-02-19
    • 2016-04-18
    相关资源
    最近更新 更多