Pregunta

Tengo una función que eso es el envío de mensajes (muchos de ellos) y sus archivos adjuntos.

Es básicamente un bucle a través de una estructura de directorios y crea mensajes de correo electrónico desde una estructura de archivos, por ejemplo,

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

La creación de los mensajes se lleva a cabo utilizando .NET en C #, material estándar.

Una vez creados todos los mensajes ... tengo otra función que se ejecuta directamente después de que copia la carpeta de mensajes a otra ubicación.

El problema es que - los archivos están bloqueados ...

Nota: No estoy moviendo los archivos, simplemente copiándolos ....

¿Alguna sugerencia sobre cómo copiar archivos bloqueados, usando C #?

Actualizar

Tengo este método añadir archivos adjuntos

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

Solución

¿Cómo estás leyendo los archivos para crear el mensaje de correo electrónico? Ellos deben abrirse como de sólo lectura, con una FileShare establece en FileShare.ReadWrite ... entonces no deben estar bloqueadas. Si está utilizando un FileStream también debe envolver su lógica en la palabra clave using por lo que el recurso está dispuesto correctamente.

Actualización:

Creo que la eliminación del propio mensaje de correo se cerrará recursos dentro de ella y desbloquear los archivos:

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

Otros consejos

odio responder a mi propio puesto, pero sí para el siguiente chico pobre que tiene este problema aquí es la solución:

después de enviar el mensaje

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

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

Desechar los archivos adjuntos ... borra la cerradura y los mensajes serán enviados con archivos adjuntos. Disponer no elimina los archivos, simplemente borra los archivos adjuntos:)

¿Está el cierre de los archivos después de haber terminado de leerlos? Si se abren para la lectura, pero no cierra cuando haya terminado, se debe mantener un bloqueo en ella hasta que el programa se cierra y se cierra automáticamente todos los archivos.

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

veo esto mucho al enviar archivos adjuntos. Normalmente uso algo como lo siguiente:

En el código que mueve los archivos a una ubicación diferente, puede utilizar el siguiente patrón:

Dentro del bucle para recorrer a través de los archivos

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top