SMTP发送锁定了我的文件 - c#

JL.*_*JL. 23 c# smtp locked-files

我有一个功能,发送消息(很多)和他们的附件.

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

 c:\emails\message01
                \attachments
 c:\emails\message02
                \attachments
Run Code Online (Sandbox Code Playgroud)

使用.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));
        }
    }
Run Code Online (Sandbox Code Playgroud)

Joh*_*sch 52

你是如何阅读文件来创建电子邮件的?它们应该以只读方式打开,FileShare设置为FileShare.ReadWrite......然后它们不应该被锁定.如果您正在使用a FileStream,则还应将您的逻辑包装在using关键字中,以便正确处理资源.

更新:

我相信处理邮件本身会关闭其中的资源并解锁文件:

using (var mail = new MailMessage())
{
    AddAttachments(mail);
}
// File copy code should work here
Run Code Online (Sandbox Code Playgroud)


JL.*_*JL. 17

讨厌回答我自己的帖子,但是对于下一个有这个问题的可怜人来说是修复:

你发送消息之后

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

        //Clean up attachments
        foreach (Attachment attachment in message.Attachments)
        {
            attachment.Dispose();
        }
Run Code Online (Sandbox Code Playgroud)

处理附件...清除锁定,消息仍将与附件一起发送.处理不删除文件,只清除附件:)

  • John Rasch有正确的答案:你应该处理`MailMessage`本身(最好将它包装在`using`块中).`MailMessage`的`Dispose`方法也处理任何附件. (6认同)