Domanda

Ho una funzione questo è l'invio di messaggi (un sacco di loro) e relativi allegati.

E 'loop essenzialmente attraverso una struttura di directory e crea messaggi di posta elettronica da una struttura di file, ad esempio

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

La creazione dei messaggi avviene tramite .net c #, roba standard.

Dopo aver creato tutti i messaggi ... io ho un'altra funzione che viene eseguito direttamente in seguito che copia il messaggio della cartella in un'altra posizione.

Il problema è - file sono bloccati ...

Nota: Non sto spostando i file, semplicemente copiandole ....

Qualche suggerimento su come copiare i file bloccati, utilizzando c #?

Aggiorna

Ho questo metodo di aggiungere allegati

    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));
        }
    }
È stato utile?

Soluzione

Come stai leggendo i file per creare il messaggio di posta elettronica? Essi dovrebbero essere aperti in sola lettura, con un FileShare impostato FileShare.ReadWrite ... allora non devono essere bloccate. Se si utilizza un FileStream si dovrebbe anche avvolgere la logica la parola using in modo che la risorsa è disposto correttamente.

Aggiornamento:

Credo che smaltire il messaggio di posta stesso si chiuderà le risorse al suo interno e sbloccare i file:

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

Altri suggerimenti

odio rispondendo mio post, ma sì per la prossima povero ragazzo che ha questo problema qui è la correzione:

DOPO aver inviato il messaggio

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

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

Smaltire gli allegati ... cancella il blocco, e messaggi saranno comunque inviati con allegati. Smaltire NON eliminare i file, basta cancella gli allegati:)

Stai chiudendo il file dopo aver finito di leggerli? Se li si apre per la lettura, ma non si chiude quando hai finito, dovrebbe mantenere un blocco su di esso fino a quando il programma viene chiuso e chiude automaticamente tutti i file.

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

Vedo questo molto quando l'invio di allegati. Io di solito uso qualcosa di simile al seguente:

Nel codice che sposta i file in una posizione diversa, è possibile utilizzare il seguente schema:

All'interno del ciclo per il ciclo attraverso il file

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

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top