Laden...

An Image gebundene Temporäre Dateien nach beenden löschen?

Erstellt von 7.e.Q vor 16 Jahren Letzter Beitrag vor 15 Jahren 6.342 Views
7.e.Q Themenstarter:in
925 Beiträge seit 2004
vor 16 Jahren
An Image gebundene Temporäre Dateien nach beenden löschen?

Hi Leute,

ich hab in einem Programm eine Reihe Bild-Dateien, die aus dem Web heruntergeladen werden. Diese werden auf der Festplatte als temporäre Dateien gespeichert, damit ich sie nicht komplett im Speicher lagern muss (sehr viele Dateien). Die Bild-Dateien sind an auf der GUI befindliche Image Controls gebunden.

Ich möchte nun, daß bei oder nach beendigen des Programms alle temporären Dateien, die das Programm angelegt hat, automatisch gelöscht werden. Ich hab dazu alle Verweise auf temporäre Dateien in einer Liste gespeichert, welche ich beim Beenden mit foreach durchlaufe und alle darin enthaltenen Dateien lösche.

Das funktioniert aber so nicht, weil in dem Moment, wenn die Liste durchlaufen wird die Dateien noch durch die GUI geöffnet sind. Sie lassen sich da noch nicht löschen. Wie sorge ich also dafür, daß die Dateien alle geschlossen werden, bevor ich sie lösche?

Danke!
Grüße,
Hendrik

R
317 Beiträge seit 2006
vor 16 Jahren

Hi,

du könntest, bevor du die Bilder löschen willst (also vor dem Beenden) alle Image Controls durchlaufen und das Image wieder auf null setzen.

Also


ImageControl.Image = null ;

Somit müsste die Bindung an das element aufgehoben sein, und du müsstest es löschen kann.

Vg,
Daniel

7.e.Q Themenstarter:in
925 Beiträge seit 2004
vor 16 Jahren

Lieder läuft die Binding nicht direkt so, wie du meinst...

Ich hab beispielsweise ein TreeView, in welches ich über ein HierarchicalDataTemplate Image Controls eingehängt habe. Das TreeView erhält nun als ItemsSource eine Liste mit Objekten, die wiederum Listen von Unterobjekten sind und so weiter. Das geht bis zu 3 Ebenen so. In der 2. und 3. Ebene befinden sich die Image Controls.

Es reicht nun nicht, das hab ich schon versucht, dem TreeView einfach als ItemsSource "null" zuzuweisen. Das veranlasst das Programm leider nicht dazu, die Bilddateien umgehend zu schließen, obwohl ja das komplette TreeView nun leer ist.

Es muss also einen Weg geben, die Datei Handles zu schließen, wenn dem TreeView als ItemsSource "null" zugewiesen wird. Bloß wie? 🤔 🤔 🤔

Danke

379 Beiträge seit 2004
vor 16 Jahren

Du musst das Bild so an dein Image-Control laden, das die Datei nicht mehr blockiert wird:

Ich habe einfach mal bei google "c# image dispose" eingegeben und folgendes gefunden:

http://www.neowin.net/forum/lofiversion/index.php/t310082.html


using(FileStream fs = new FileStream(fileDlg.FileName,
      FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
  {
   Image img = Image.FromStream(fs);
   fs.Close();
   pictureBox1.Image = img.Clone() as Image;
   img.Dispose();
   File.Delete(fileDlg.FileName);
  }

Ich hoffe das hilft dir weiter

ciao Anke

7.e.Q Themenstarter:in
925 Beiträge seit 2004
vor 16 Jahren

Das macht das Image Control von WPF ja alles intern. Ich geb dem als Source ja nur den Pfad zur Datei. Sei es eine URL im Web oder eine auf der lokalen Platte - spielt keine Rolle. Ich hab die Dateien jetzt temporär auf der Platte, damit die nicht den RAM vollmüllen, wie sie es tun, wenn ich sie direkt aus dem Web lade, indem ich dem Image Control die Web URL als Source übergebe.

Das heißt, ich habe kein "Image" Objekt, welches ich disposen könnte, sondern nur einen einfachen String.

U
1.688 Beiträge seit 2007
vor 15 Jahren

Da ich selber grad ein ähnliches Problem habe und bei Recherchen auch auf diesen Beitrag gestoßen bin, hier die Lösung:


<Image>
  <Image.Source>
    <BitmapImage UriSource="c:\bilder\bild.png" CacheOption="OnLoad" />
  </Image.Source>
</Image>