Guten Tag,
mein neues Problem sieht folgendermaßen aus:
Ich habe in eine pictureBox eine BMP aus einer Datei geladen.
Wenig später (wenn der Nutzer dies auswählt) wird diese BMP gelöscht.
Leider fliegt das Programm bei mir raus, weil es noch selber auf die Datei zugreift!
Da der Befehl:
pictureBox1.Image = Bitmap.FromFile("C:\\Bild.bmp");
keine weiter Möglichkeit bietet, den Zugriff auf die Datei zu beenden, wollte ich mal fragen, wie man das sonst machen kann.
Danke für Tipps!
Hallo sowas1111,
Die Datei wird zwar nach erfolgreichem Laden wieder geschlossen aber die das Bild wird "gesperrt" und wird erst in dem Moment freigegeben sobald das Image
disposed wird, also sobald du pictureBox1.Image.Dispose()
aufrufst oder dies irgendwie anderweitig aufgerufen wird, z.b. durch Schließen des Fensters.
Gruß
Michael
Hallo xxMUROxx,
pictureBox1.Image.Dispose()
ist keine so gute Idee, denn solange das Bild an PictureBox.Image zugewiesen ist, wird es von der PictureBox benötigt und da sollte man es der PictureBox nicht "unter dem Hintern wegziehen".
Hallo sowas1111,
trotzdem ist natürlich richtig, dass Bitmap.Dispose den Dateizugriff beendet.
Wenn du beides gleichzeitig brauchst, also Zugriff auf das Bitmap-Objekt und Zugriff auf die Bild-Datei, gibt es im Grunde zwei Möglichkeiten (wurde auch schon mehrmals im Forum besprochen).
Bitmap normal laden und dann umkopieren, z.B. mit new Bitmap/Graphics.FromImage/Graphics.DrawImage oder einfach mit Bitmap.Clone und dann das Original mit Dispose zerstören.
Oder noch besser, klarer und sicherer Inhalt der der Bilddatei laden (File.ReadAllBytes), in einen MemoryStream packen und das Bitmap-Objekt aus diesem Stream laden.
herbivore
Hallo herbivore,
hab mich etwas ungünstig ausgedrückt. Hab natürlich nicht gemeint, dass man das Dispose auf der PictureBox.Image direkt aufruft, sondern dass das Image Disposed werden muss, unabhängig der PictureBox. Wollte mit pictureBox1.Image.Dispose()
nur aufzeigen welches Image Disposed werden muss.
Danke für die Vorschläge,
das hier funktioniert aber noch nicht...
Bitmap bild1 = new Bitmap(Bitmap.FromFile(C:\\Bild.bmp"));
Bitmap bild = new Bitmap(bild1);
bild1.Dispose();
pictureBox1.Image = bild;
Wenn ich jetzt File.Delete("C:\Bild.bmp"); mache, stürtzt das Programm immer noch ab...
Wie wäre es wenn du einenen DateiStream erstellst und die Bitmap über diesen öffnest:
FileStream fs = new FileStream("C:\\Bild.bmp",FileMode.Open);
Bitmap bmp = new Bitmap(fs);
fs.Close();
Nicht gut, man darf dem Bitmap-Objekt nicht den Stream unter dem Hintern wegziehen.
Danke für die Hilfe, jetzt funktioniert es nämlich!
So habe ich den Problem jetzt geändert:
FileStream bild1 = new FileStream(C:\\Bild.bmp", FileMode.Open);
Bitmap bild = new Bitmap(bild1);
bild1.Dispose();
bild1.Close();
pictureBox1.Image = bild;
und später dann:
File.Delete("C:\\Bild.bmp");
Danke für die Hilfe!
Am sichersten ist immer noch der Weg über den MemoryStream.