Pergunta

Eu tenho uma função que está enviando mensagens (muitas delas) e seus anexos.

Basicamente, ele atravessa uma estrutura de diretório e cria e -mails de uma estrutura de arquivo, por exemplo

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

A criação das mensagens ocorre usando .NET C#, Standard Stuff.

Depois que todas as mensagens são criadas ... tenho outra função que funciona diretamente depois que copia a pasta de mensagens para outro local.

O problema é: os arquivos estão bloqueados ...

Nota: não estou movendo os arquivos, apenas copiando -os ....

Alguma sugestão sobre como copiar arquivos bloqueados, usando C#?

Atualizar

Eu tenho esse método de addings anexos

    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));
        }
    }
Foi útil?

Solução

Como você está lendo os arquivos para criar a mensagem de email? Eles devem ser abertos como somente leitura, com um FileShare definido como FileShare.ReadWrite... então eles não devem estar trancados. Se você estiver usando um FileStream você também deve envolver sua lógica no using palavra -chave para que o recurso seja descartado corretamente.

Atualizar:

Acredito que descartar a mensagem de email em si fechará os recursos dentro dela e desbloqueará os arquivos:

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

Outras dicas

Odeio responder ao meu próprio post, mas sim, para o próximo pobre rapaz que tem esse problema aqui é a correção:

Depois de enviar a mensagem

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

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

Descarte os anexos ... limpa o bloqueio e as mensagens ainda serão enviadas com anexos. Dispone não exclui os arquivos, apenas limpa os anexos :)

Você está fechando os arquivos depois de terminar de lê -los? Se você os abrir para leitura, mas não os feche quando terminar, ele deve manter um bloqueio até que o programa sai e feche automaticamente todos os arquivos.

    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); 
      }
    }

Eu vejo muito isso ao enviar anexos. Eu normalmente uso algo como o seguinte:

No código que move os arquivos para um local diferente, você pode usar o seguinte padrão:

Dentro do loop para loop através dos arquivos

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.
   }

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top