Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

1

05.01.2013, 01:23

WPF Daten freigeben und löschen

Hey,
ich schreibe aktuell an einem Programm, bei welchem ich am Anfang ein Zip-Archiv lade und entpacke. Am Ende möchte ich den entpackten Ordner wieder löschen. Im Archiv sind Bilder, welche ich zur Laufzeit im Programm verwende.
Mein aktueller Ansatz ist in OnClosed über System.IO.Directory.Delete(directory, true); den Ordner zu löschen. Das Funktioniert nicht, da die Bilder noch vom Programm verwendet werden. Ich lösche vorher die Liste in welcher die Bilder gespeichert sind und versuche über GC.Collect(); die Daten freizugeben. Nun ja mit dem GarbageCollector ist das ja so ne Sache. Der handelt ja normal in eigenem ermessen.
Hat jemand einen Vorschlag, wie ich die Bilder vernünftig wieder freigeben kann um den Ordner danach zu löschen?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Schorsch« (05.01.2013, 01:31)


Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

2

05.01.2013, 01:39

Normalerweise haben Ressourcen doch eine "Dispose"-Methode (und erben von "IDisposable"), mit der man sie garantiert wieder sicher freigibt?

Also es wäre interessant zu wissen mit welchen Code\API du die Bilder öffnest.
Ggf. gibt es auch einen Trick, wie man die Bilder öffnet, ohne das die Dateien überhaupt dauerhaft gesperrt werden.

Nebenbei:
Ich finde es eine ziemlich seltsame Vorgehensweise die Dateien erst in einen temporären Ordner zu entpacken und dann von dort aus zu öffnen... :huh:

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

05.01.2013, 01:45

Mit Sharpcompress entpacke ich die Daten. Ich hatte auch schon darüber nachgedacht die Daten direkt in den RAM zu laden, bin mir jedoch noch nicht sicher wie ich das mit Sharpcompress realisieren soll/kann. Das Bild selber lade ich dann über den Konstruktor von BitmapImage, welchem man direkt ein URI Objekt übergeben kann. Im Prinzip möchte ich nur das Archiv entpacken und die einzelnen Bilder vom Programm laden und anzeigen. Die Archive selbst können auch mal 100 oder 200mb groß sein.
Hast du einen Vorschlag wie ich das ganze anders umsetzen könnte?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

4

05.01.2013, 01:53

In Dot.Net 4.5 gibt es direkt im Framework ZipArchiv\ZipFile-Klassen im Namensraum "System.IO.Compression".
Ansonsten kommt mir das schon sehr komisch vor, dass deine Libary nicht das Einlesen über Streams unterstützt.

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

05.01.2013, 02:28

Die Sache ist, dass ich hinterher auch andere Archivtypen wie zum Beispiel Rar unterstützen möchte. Deswegen habe ich auf Sharpcompress zurückgegriffen. Ich bin grade dabei zu versuchen die Bilder in einen Stream zu laden. Klappt noch nicht so ganz wie ich mir das vorstelle aber ich versuchs weiter. Gibt es denn sonst noch ne andere Möglichkeit, welche ich vielleicht grad nicht in Betracht ziehe?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

05.01.2013, 09:32

Du musst einfach nur das Bild als Stream laden und nicht über eine Uri. Dann sollte es funktionieren. Das ist ein etwas seltsames Verhalten von WPF:

C#-Quelltext

1
2
3
4
5
6
7
8
BitmapImage image = new BitmapImage();
using (FileStream stream = File.OpenRead(myImageFile))
{
    image.BeginInit();  
    image.CacheOption = BitmapCacheOption.OnLoad;   
    image.StreamSource = stream;    
    image.EndInit();
}

Schorsch

Supermoderator

  • »Schorsch« ist der Autor dieses Themas

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

07.01.2013, 13:51

So nun habe ich ein wenig Zeit gefunden und konnte etwas weiter entwickeln. Durch den Stream konnte ich das Problem lösen. Ist wirklich merkwürdiges Verhalten. Hatte noch ein weiteres Problem, welches ich wegen eines Logikfehlers erst gar nicht bemerkt habe. Man kann ein BitmapImage nicht ohne weiteres an einen anderen Thread geben. Zuerst muss Freeze() auf dem Bild aufgerufen werden. Ansonsten ist die Funktionalität an sich fertig. Danke euch.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige