我有一个函数这就是发送消息(他们中的很多)及其附件。

它基本上循环遍历目录结构并从文件结构的示例创建电子邮件

 c:\emails\message01
                \attachments
 c:\emails\message02
                \attachments

消息的创建发生使用.NET C#,标准的东西。

创建的所有消息后,我还运行直接事后另一个函数,复制邮件文件夹到另一个位置。

问题是 - 文件被锁定...

请注意:我不动的文件,只需将它们复制....

这是如何复制锁定的文件,使用C#有什么建议?

<强>更新

我有这样的添加附件方法

    private void AddAttachments(MailMessage mail)
    {
        string attachmentDirectoryPath = "c:\messages\message1";
        DirectoryInfo attachmentDirectory = new DirectoryInfo(attachmentDirectoryPath);
        FileInfo[] attachments = attachmentDirectory.GetFiles();
        foreach (FileInfo attachment in attachments)
        {
            mail.Attachments.Add(new Attachment(attachment.FullName));
        }
    }
有帮助吗?

解决方案

你是如何读取文件来创建电子邮件消息?他们应该打开为只读,具有FileShare设置为FileShare.ReadWrite ...那么他们不应该被锁定。如果您使用的是FileStream你也应该让资源妥善处理包裹你的逻辑在using关键字。

更新

我相信处置的邮件本身将内部关闭资源和解锁文件:

using (var mail = new MailMessage())
{
    AddAttachments(mail);
}
// File copy code should work here

其他提示

恨回答我自己的职位,但是,是下一个可怜的家伙谁在这里有这个问题的修补程序:

<强>在发送消息

        // Send the mail
        client.Send(message);

        //Clean up attachments
        foreach (Attachment attachment in message.Attachments)
        {
            attachment.Dispose();
        }

处置附件...清除锁,和消息仍然会带有附件发送。处置不删除文件,只要清除附件:)

您在关闭文件你读完之后他们?如果你打开他们的阅读,但不关闭它们当你完成的时候,应该就可以了锁,直到程序退出,并自动关闭所有文件。

    MailMessage email = new MailMessage();

    email.From = txtFrom.Text;
    email.To = txtToEmail.Text;
    email.Subject = txtMSubject.Text; 
    email.Body = txtBody.Text;

    SmtpClient mailClient = new SmtpClient();
    mailClient.Host = "smtp.emailAddress";
    mailClient.Port = 2525;
    mailClient.Send(email );
    email.Dispose();

    // After Disposing the email object you can call file delete

    if (filePath != "")
    {
      if (System.IO.File.Exists(filePath))
      {
        System.IO.File.Delete(filePath); 
      }
    }

我发送附件时这看到很多。我通常使用类似如下:

在该文件移动到不同的位置的代码,则可以使用以下模式:

在循环内部,用于通过文件循环

bool FileOk = false;
while (!FileOk)
{
   try
   {
      // code to move the file
      FileOk = true;
   }
   catch(Exception)
   {
      // do nothing or write some code to pause the thread for a few seconds.
   }

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top