Laden...

Alle Dateien aus einem Verzeichnis, nach versenden als Attachment, löschen

Erstellt von Kleba vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.003 Views
K
Kleba Themenstarter:in
71 Beiträge seit 2007
vor 16 Jahren
Alle Dateien aus einem Verzeichnis, nach versenden als Attachment, löschen

Hallo Leute,

ich hoffe ihr könnt mir helfen, wobei ich vermute, dass es einen simplen Lösungsansatz gibt. Habe nur gerade ein Brett vorm Kopf 😕

Es geht eigentlich nur darum, dass alle Dateien (eines bestimmten Typs) aus einem Verzeichnis gelöscht werden. Das eigentlich Problem ist, dass diese Dateien vorher per E-Mail-Attachment versendet werden und dann der Fehler kommt, dass kein Zugriff auf die Dateien möglich ist, weil sie ja angeblich noch verwendet werden.

War eine kleine Aufgabe von der Arbeit. Einer braucht ein kleines Tool, dass alle (in dem Fall .txt) Dateien aus einem Verzeichnis einzeln per Mail verschickt. Ich bin jetzt schon die ganze Zeit am probieren und irgendwie will es nicht klappen. Hab meine bisherigen Versuche auch schon wieder aus Wut gelöscht 😕

Ich bin mir auch nicht ganz sicher ob der die löscht während sie noch als Attachment versendet werden. Dann könnte ich die Zugriffsverletzung ja noch verstehen. Habt ihr eine Idee wie ich das elegant lösen kann? Vielleicht müsst ich ja auch einfach nur ein Sekunden warten bis die Sachen endgültig verschickt sind? Oder werden die in den Speicher geladen und nach dem Versenden nicht wieder freigegeben?

Danke im Voraus für die Hilfe
Kleba

Alle sagten es geht nicht. Da kam einer der wusste das nicht und tat es.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Kleba,

die wichtigste Information hast du unterschlagen: Wie erfolgt das Versenden?

herbivore

K
Kleba Themenstarter:in
71 Beiträge seit 2007
vor 16 Jahren

für das versenden wird zu Anfang ein SmtpClient erzeugt welcher dann die Messages - nachdem die letzte erzeugt wurde - versendet.
Das versenden der einzelnen Mails mit Attachment klappt auch. Wie gesagt, halt nur, das Löschend er Attachments anschliessend nicht.

Alle sagten es geht nicht. Da kam einer der wusste das nicht und tat es.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Kleba,

vermutlich fehlt ein Dispose in für das Attachement deinem SmtpClient-Code.

herbivore

K
Kleba Themenstarter:in
71 Beiträge seit 2007
vor 16 Jahren

Attachment sollte eigentlich Disposed sein. Hab auch zwischenzeitlich mal alles Disposed was irgendwie geht, aber er machts trotzdem nicht. Könnte natürlich auch ein "kleiner" Fehler in meiner Konstruktion sein. Hatte ehrlich gesagt, auch noch nicht soviel Zeit, dass ordentlicher zu machen. Möglicherweise ein Flüchtigkeitsfehler der nicht mehr aufgefallen ist...

    public void Mails()
        {
            Form1 newForm = new Form1();

            string SenderUsername = txtSenderUser.Text;
            string SenderPW = txtSenderPW.Text;
            string SenderMail = txtSenderMail.Text;
            string SenderHost = txtHost.Text;
            string ReceipMail = txtReceipMail.Text;
            string ReceipSubject = txtReceipSubject.Text;
            string ReceipMessage = txtMessage.Text;

            SmtpClient Client = new SmtpClient();

            MailAddress from = new MailAddress(SenderMail);
            MailAddress to = new MailAddress(ReceipMail);
            MailMessage message = new MailMessage(from, to);
            message.Body = "\"" + ReceipMessage + "\"";

            System.Net.NetworkCredential creds = new System.Net.NetworkCredential("\"" + SenderUsername + "\"", "\"" + SenderPW + "\"");

            Client.Host = SenderHost;
            Client.Credentials = creds;

            string WorkingDir = txtPath.Text;
            string[] allFiles = Directory.GetFiles(WorkingDir, "*.txt");

            int index = allFiles.GetLength(0);

            do
            {

                string ActualFile = allFiles[index - 1].ToString();

                index--;

                Attachment mitDabei;
                mitDabei = new Attachment(ActualFile);
                message.Attachments.Add(mitDabei);

                message.Subject = ReceipSubject;

                try
                {
                    Client.Send(message);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

                message.Attachments.Remove(mitDabei);

                if (index <= 0)
                {
                    Client.Send(message);
                    message.Attachments.Dispose();
                    message.Dispose();
                    newForm.Close();
                    newForm.Dispose();
                }
                continue;
            }while (index != 0);

Alle sagten es geht nicht. Da kam einer der wusste das nicht und tat es.

40 Beiträge seit 2007
vor 16 Jahren

Im MSDN-Forum gab es auch jemanden mit dem Problem:

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1967903&SiteID=1

Verschieb mal das message.Dispose() direkt nach Client.Send() im Try-Block (das nachfolgende message.Attachments.Remove(mitDabei); brauchst du glaub ich gar nicht) bzw. füge es dort zusätzlich hinzu.

Habs dir mal umgeschrieben


public void Mails()
        {
            string SenderUsername = txtSenderUser.Text;
            string SenderPW = txtSenderPW.Text;
            string SenderMail = txtSenderMail.Text;
            string SenderHost = txtHost.Text;
            string ReceipMail = txtReceipMail.Text;
            string ReceipSubject = txtReceipSubject.Text;
            string ReceipMessage = txtMessage.Text;

            SmtpClient Client = new SmtpClient();

            
            System.Net.NetworkCredential creds = new System.Net.NetworkCredential("\"" + SenderUsername + "\"", "\"" + SenderPW + "\"");
            Client.Host = SenderHost;
            Client.Credentials = creds;

            MailAddress from = new MailAddress(SenderMail);
            MailAddress to = new MailAddress(ReceipMail);

            string WorkingDir = txtPath.Text;
            string[] allFiles = Directory.GetFiles(WorkingDir, "*.txt");

            int index = allFiles.GetLength(0);

            do
            {

                string ActualFile = allFiles[index - 1].ToString();

                index--;

                Attachment mitDabei;
                mitDabei = new Attachment(ActualFile);

                MailMessage message = new MailMessage(from, to);    
                message.Body = "\"" + ReceipMessage + "\"";
                message.Attachments.Add(mitDabei);
                message.Subject = ReceipSubject;

                try
                {
                    Client.Send(message);
                    message.Dispose();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }

            }while index != 0);


Deine Form-Zeilen hab ich weggelassen und deine if(index≤0) am Ende hab ich nicht so ganz verstanden... aber ich denke es sollte so gehen wie ichs geschrieben habe.

K
Kleba Themenstarter:in
71 Beiträge seit 2007
vor 16 Jahren

hmmm ... leider klappt es nicht so ganz. Er sagt mit dann nämlich, wenn er das Attachment wieder hinzufügen will (beim 2. Durchlauf) das er auf das verworfene Objekt nicht zugreifen kann.

Alle sagten es geht nicht. Da kam einer der wusste das nicht und tat es.

K
Kleba Themenstarter:in
71 Beiträge seit 2007
vor 16 Jahren

so Leute,

ich habe jetzt übrigens endlich eine Lösung gefunden (die Hilfen von euch wollten irgendwie nicht so richtig - trotzdem vielen, vielen Dank für die Hinweise).
Wenn ich mich richtig erinnere ist es ja gewünscht, den Code nach erfolgreichem lösen für andere zu posten, aber das muss ich später machen. Der ist nämlich im Moment sowas von dahingeklatscht (und ich glaube auch teilweise etwas unelegant gelöst) dass ich den erst noch überarbeiten, kommentiere und in eine ansehnliche Struktur bringe.
Muss nur jetzt erstmal meine geröteten AUgen entspannen lassen und dann werd ich wohl morgen weitermachen...
Bis dahin!
Kleba

Alle sagten es geht nicht. Da kam einer der wusste das nicht und tat es.