Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
An Image gebundene Temporäre Dateien nach beenden löschen?
7.e.Q
myCSharp.de - Member

Avatar #avatar-3402.jpg


Dabei seit:
Beiträge: 925
Herkunft: Scheeßel

Themenstarter:

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

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
robbyrc
myCSharp.de - Member



Dabei seit:
Beiträge: 317
Herkunft: Passau

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
7.e.Q
myCSharp.de - Member

Avatar #avatar-3402.jpg


Dabei seit:
Beiträge: 925
Herkunft: Scheeßel

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
hurricane
myCSharp.de - Member

Avatar #avatar-1740.jpg


Dabei seit:
Beiträge: 379
Herkunft: bei Berlin

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von hurricane am .
private Nachricht | Beiträge des Benutzers
7.e.Q
myCSharp.de - Member

Avatar #avatar-3402.jpg


Dabei seit:
Beiträge: 925
Herkunft: Scheeßel

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
ujr
myCSharp.de - Experte



Dabei seit:
Beiträge: 1.688

beantworten | zitieren | melden

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>
private Nachricht | Beiträge des Benutzers