Frage

Ich habe eine Funktion, die Nachrichten (viele von ihnen) und ihre Anhänge sendet.

Es schaltet im Grunde genommen eine Verzeichnisstruktur durch und erstellt beispielsweise E -Mails aus einer Dateistruktur

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

Die Erstellung der Nachrichten erfolgt mit .NET C#, Standardmaterial.

Nachdem alle Nachrichten erstellt wurden, habe ich eine andere Funktion, die direkt danach ausgeführt wird, die den Nachrichtenordner an einen anderen Ort kopiert.

Problem ist - Dateien sind gesperrt ...

Hinweis: Ich bewege die Dateien nicht, kopiere sie nur ....

Irgendwelche Vorschläge, wie ich gesperrte Dateien mit C#kopieren kann?

Aktualisieren

Ich habe diese Methode für die Anhänge hinzufügen

    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));
        }
    }
War es hilfreich?

Lösung

Wie lesen Sie die Dateien, um die E -Mail -Nachricht zu erstellen? Sie sollten als schreibgeschützt mit a geöffnet werden FileShare einstellen FileShare.ReadWrite... dann sollten sie nicht verschlossen sein. Wenn Sie a verwenden FileStream Sie sollten auch Ihre Logik in die using Schlüsselwort, damit die Ressource ordnungsgemäß entsorgt wird.

Aktualisieren:

Ich glaube, die Entsorgung der Mail -Nachricht selbst schließt die Ressourcen darin und entsperren Sie die Dateien:

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

Andere Tipps

Hasse es, meinen eigenen Beitrag zu beantworten, aber ja, für den nächsten armen Kerl, der dieses Problem hier hat, ist die Lösung:

Nachdem Sie die Nachricht gesendet haben

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

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

Entsorgen Sie die Anhänge ... löscht das Schloss und Nachrichten werden weiterhin mit Anhängen gesendet. Dispose löscht die Dateien nicht, löscht nur die Anhänge :)

Schließen Sie die Dateien, nachdem Sie sie gelesen haben? Wenn Sie sie zum Lesen öffnen, aber nicht schließen, wenn Sie fertig sind, sollte es ein Sperren aufbewahren, bis das Programm beendet und automatisch alle Dateien geschlossen wird.

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

Ich sehe das beim Senden von Anhängen viel. Normalerweise benutze ich so etwas wie Folgendes:

In dem Code, der die Dateien an einen anderen Ort verschiebt, können Sie das folgende Muster verwenden:

In der Schleife zum Durchschleifen durch die Dateien

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

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top