Envoyer SMTP verrouille mes fichiers - c #
-
18-09-2019 - |
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));
}
}
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.
}
}