题
我有一个函数这就是发送消息(他们中的很多)及其附件。
它基本上循环遍历目录结构并从文件结构的示例创建电子邮件
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.
}
}
不隶属于 StackOverflow