Laden...

Warum lässt sich eine temporäre Datei nach "DownloadFile" nicht löschen?

Erstellt von joe@vstw vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.554 Views
J
joe@vstw Themenstarter:in
9 Beiträge seit 2020
vor 3 Jahren
Warum lässt sich eine temporäre Datei nach "DownloadFile" nicht löschen?

hallo,

ich lade eine Datei per


                using (WebClient myWebClient = new WebClient())
                {
                    myWebClient.DownloadFile(remoteUri, fileName);
                    myWebClient.Dispose();
                }

in ein temporäres Verzeichnis und möchte die Datei anschließend - je nach Entscheidung - mit MOVE verschieben oder mit DELETE wieder löschen. Beides ist aber nicht möglich, Fehlermeldung

Fehlermeldung:
Die Datei kann nicht gelöscht werden da sie in vshost32.exe geöffnet ist

Warum in aller Welt - COPY ist möglich, aber DELETE selbst in "FormClosed" nicht...

Gruß Josef

T
2.223 Beiträge seit 2008
vor 3 Jahren

Das Dispose aufrufen im using ist redundant und somit überflüssig.
Ebenfalls kann dir hier keiner anhand deines Codes, der nur irgend einen Download abdeckt, sagen warum deine Datei von vshost32.exe gesperrt ist.

Wie wir die Datei weiter verwendet bzw. wird damit noch was anderes gemacht als der Download?
Bzw. wie sie der Move/Copy/Delete Part bei dir aus?
Je nachdem, wenn noch eine weitere Verwendung vorliegt, kann die Datei dann auch in Benutzung sein und somit auch korrekterweise gesperrt sein.

Nachtrag:
Ebenfalls solltest du nicht den WebClient nutzen, sondern den HttpClient.
Steht auch als Hinweis in der Dokumentation der Klasse.

WebClient Hinweis

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

J
joe@vstw Themenstarter:in
9 Beiträge seit 2020
vor 3 Jahren

Hallo T-Virus,

dass Dispose redundant ist weiß ich, es war nur ein Versuch ob es das Problem löst. Ebenso der Webclient. Keine Verbesserung. Im Programm geht es im Prinzip (teils in Subroutinen) folgendermaßen weiter:

                pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
                pictureBox1.Image = Image.FromFile(path);  // Einlesen des Bildes
 
                // Info zum Bild
                creationDate = "1" + File.GetLastWriteTime(path).ToString("yyyyMMddhhmmss");
                edFileDate.Text = roaming.fmtMyDateTimeStr(creationDate, 1, isAbk);
                if (String.IsNullOrEmpty(edDate.Text)) { edDate.Text = edFileDate.Text; }
                long length = new System.IO.FileInfo(path).Length;
                fileSize = Convert.ToInt32(length);
                edFileSize.Text = length.ToString();

und dann Anzeige des Bildes, bei Cancel

            if (!String.IsNullOrEmpty(filename))
            {
                try
                {
                    System.IO.File.Delete(@filename);
                    isOK = true;
                }
                catch { }
            }

wobei der Dateiname immer mal ein anderer ist wegen Weiterreichung als Parameter. Sorry, das Projekt ist schon etwas umfangreicher...

Gruß Josef

J
joe@vstw Themenstarter:in
9 Beiträge seit 2020
vor 3 Jahren

Hallo Th69,

"Die Datei bleibt gesperrt, bis die Image verworfen wird."

Ja, wann wird sie denn verworfen? Ich dachte, wenn ich das Löschen im FormClosed-Ereignis mache wäre das bereits passiert?

Ich habe jetzt vors Löschen ein pictureBox1.Dispose(); gesetzt - ohne Erfolg. Selbst nachdem das Formular geschlossen ist (Hauptformular noch offen) lässt mich nicht mal Windows die Datei löschen, immer noch "...von vshost32.exe geöffnet. Geht erst, wenn das komplette Programm mit allen Fenstern geschlossen ist.

Allerdings gibt es einen Unterschied: Wenn ich das aus der IDE starte, heißt es vshost32.exe, wenn ich das kompilierte Programm außerhalb der IDE starte, steht mein Projektname in der Meldung. Klingt logisch.

Also ich habe ein Formular fmMain, rufe von da ein Formular fmSearchImg auf, das zeigt wie der Explorer alle Mediendateien an, und ein Button da drauf ruft ein Formular fmEditImg auf. In dem wird ein Bild aus dem Web wie beschrieben geladen und in einer picturebox angezeigt. Button OK soll die Datei unter anderem Namen ins Medienverzeichnis kopieren, das funktioniert, und die temporäre löschen, ebenso bei Cancel. Funktioniert alles prächtig, bis aufs Löschen...

Gruß Josef

463 Beiträge seit 2009
vor 3 Jahren

Die Suchfunktion des Forums ist übrigens sehr gut...

Bild löschen (in use...)

Dateien löschen - Fehler: Prozess nutzt Dateien

und es gibt noch einige mehr zu geinau deinem Thema...

J
joe@vstw Themenstarter:in
9 Beiträge seit 2020
vor 3 Jahren

Hallo Stefan,

das glaube ich gerne, habe auch hier gesucht, aber es hängt halt immer davon ab wie man seine Frage stellt, da habe ich wohl zuviele, zuwenige oder die falschen Schlüsselwörter verwendet. Ich war gestern stundenlang in verschiedenen Foren am Suchen, und meist war es nicht ganz genau dasselbe Problem.

Ich gehe den Tipps gleich mal nach, DANKE!

Gruß Josef

J
joe@vstw Themenstarter:in
9 Beiträge seit 2020
vor 3 Jahren

Zwischenergebnis: Bild laden auskommentiert - Datei lässt sich problemlos löschen!

J
joe@vstw Themenstarter:in
9 Beiträge seit 2020
vor 3 Jahren

Hallo,

danke an euch,

> Bild löschen (in use...)

war an sich genau das was ich gemacht hatte. Trotzdem ging es nicht. Unterschied: Ich habe kein lokal erzeugtes Image img = ..., sondern eine mit der Toolbox aufs Formular gesetzte pictureBox.

Was nicht funktioniert hat:


Image img = Image.FromFile(path);
try
{
   pictureBox1.Image = img;
}
catch (Exception ex) { MessageBox.Show(ex.ToString()); }
img.Dispose();

das hat mir sogar das "try" um die Ohren gehauen, sprich das Formular sang- und klanglos beendet! Fehler: irgendwas mit null-Exception bei Width() beim Übertragen von img.

Lösung:

beim Bild laden wie bisher:

pictureBox1.Image = Image.FromFile(path);

aber vor dem Löschen (am Programmende in fmEditImg_FormClosed):

pictureBox1.Image.Dispose();

--- und NICHT:

pictureBox1.Dispose();

Ja, ich hab's begriffen, man muss halt sehr genau hinschauen/hören: Das Bild freigeben, also Image, nicht die PictureBox... mea culpa!

Dank auch an herbivore für den Thread mit der Lösung!

Gruß Josef

463 Beiträge seit 2009
vor 3 Jahren

Ein Bitte noch - kannst du deine C# Code vernünftig formatieren? Würde allen das Leben sehr erleichtern!

2.207 Beiträge seit 2011
vor 3 Jahren

Hey joe@vstw,

ich habe jetzt jeden(!) deiner Beiträge in diesem Thread editiert. Bitte packe Code in Code-Tags, Fehlermeldungen in Fehler-Tags und Zitate in Zitat-Tags.

[Hinweis] Wie poste ich richtig?

Danke

Coffeebean

J
joe@vstw Themenstarter:in
9 Beiträge seit 2020
vor 3 Jahren

perfekt! 🙂
danke!