Question

J'ai une fonction des thats d'envoyer des messages (beaucoup d'entre eux) et leurs pièces jointes.

Il boucles essentiellement par une structure de répertoires et crée des e-mails à partir d'une structure de fichiers par exemple

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

La création des messages a lieu en utilisant .net c #, trucs standard.

Une fois que tous les messages sont créés ... J'ai une autre fonction qui exécute directement après que des copies du dossier de message à un autre emplacement.

Le problème est - les fichiers sont verrouillés ...

Note: Je ne bougerai pas les fichiers, il suffit de les copier ....

Toutes les suggestions sur la façon de copier les fichiers verrouillés, en utilisant c #?

Mise à jour

J'ai cette méthode ajouter des pièces jointes

    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));
        }
    }
Était-ce utile?

La solution

Comment vous lisez les fichiers pour créer le message électronique? Ils devraient être ouverts en lecture seule, avec un FileShare réglé sur FileShare.ReadWrite ... ils ne devraient pas être verrouillés. Si vous utilisez un FileStream vous devez également envelopper votre logique dans le mot-clé using de sorte que la ressource est disposée correctement.

Mise à jour:

Je crois disposer le message lui-même fermer les ressources en son sein et déverrouiller les fichiers:

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

Autres conseils

haine répondant à mon poste, mais oui pour le prochain pauvre gars qui a ce problème est le correctif ici:

APRÈS envoyer le message

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

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

Jeter les pièces jointes ... efface le verrou, et les messages seront toujours envoyés avec des pièces jointes. Dispose ne supprime pas les fichiers, juste les pièces jointes efface:)

Vous fermez les fichiers après avoir terminé les lire? Si vous les ouvrez pour la lecture, mais ne les fermez pas lorsque vous avez terminé, il devrait garder un verrou sur jusqu'à ce que le programme se termine et se ferme automatiquement tous les fichiers.

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

Je vois beaucoup lors de l'envoi de pièces jointes. J'utilise normalement quelque chose comme ce qui suit:

Dans le code qui déplace les fichiers vers un autre emplacement, vous pouvez utiliser le modèle suivant:

Dans la boucle pour une boucle à travers les fichiers

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

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top