Hallo,
habe ein, für euch bestimmt, kleines Problem 😃
In einem Windows Form wird ein Bild angezeigt und andere Sachen aus einer DB. In der DB steht nur der Dateiname.
Klicke ich auf den Button Löschen soll der Beitrag aus der DB gelöscht werden und das Bild!!
Der Beitrag wird gelöscht! Aber bei dem Bild kommt Fehlermeldung: > Fehlermeldung:
Datei wird von einem anderen Prozess verwendet.
Habe von hier auch schon manches durch und verschiedenes versucht ... aber nix geht 😦
Hier der Code wie ich das Bild lade, eine Version davon:
if (bild != "")
{
Coverbild.Image.Dispose();
// Test mit streamreader wegen löschen
StreamReader SR = new StreamReader(Funktionen.FilmcoverPfad + bild);
Coverbild.Image = Image.FromStream(SR.BaseStream);
SR.Close();
SR.Dispose();
//Coverbild.Image = Image.FromFile(Funktionen.FilmcoverPfad + bild);
}
Da hatte ich Verschiedene Varianten von
Hier der Code für das löschen, auch eine Version davon:
.
.
.
Coverbild.Image.Dispose();
Coverbild.Image = null;
CDateiname = Funktionen.FilmcoverPfad + CoverDateiname_Alt;
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
if (CoverDateiname_Alt != "")
{
if (File.Exists(CDateiname))
{
File.Delete(CDateiname);
}
}
.
.
.
Da hatte ich auch Verschiedene Varianten von
egal was ich versuche bekomme immer die gleiche Fehlermeldung 😦
Vielleicht stehe ich ja auch mal wieder vor einer Wand ...
Habe Ihr vielleicht einen Vorschlag noch oder eine Lösung?
Lieben Gruß
TigerCrow
Whew.. was versuchst Du denn da?
Das sieht mit dem GC-Zeug nach einem ziemlich planlosen Rumgestochere aus 😉
Image.FromStream kann so nicht verwendet werden; das kannst Du mit Sicherheit auch der Doku entnehmen.
Denn der Stream muss offen bleiben. Das Control schließt den Stream.
Du musst ein Bild in den Speicher kopieren (Memory Stream).
Ansonsten bleibt eine Referenz auf der Datei.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo TigerCrow,
arbeite mit usings, dann sparst du dir die ganzen manuellen Disposing()-Aufrufe.
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
In diesem Fall wäre using() ebenso falsch/würde nicht helfen, da Image hier einen offenen Stream haben will, der dann selbst verwaltet wird.
Aber grundsätzlich hat Coffeebean recht: wenn möglich immer using() verwenden.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo zusammen,
erstmal danke 😃 für die Antworten
Das Chaos kommt durch meine testerrei ... sorry
und seht Ihr, das mit dem Memory Stream ist das einzigste was ich noch net getestet habe!
Berichte euch ob es geklappt hat
Gruß
TigerCrow
Hallo zusammen,
habe es jetzt gelöst und es geht 😃
Coverbild.Image.Dispose();
string fileName = Funktionen.FilmcoverPfad + bild;
FileStream fs = new FileStream(fileName, FileMode.Open);
Coverbild.Image = Image.FromStream(fs);
fs.Close();
CoverDateiname = Funktionen.FilmcoverPfad + bild;
Danke nochmals für eure Tips!
Gruß
TigerCrow
Ich hätte es so geschrieben:
Coverbild.Image?.Dispose(); // mit Abfrage auf Null
string fileName = Path.Combine(Funktionen.FilmcoverPfad, bild);
using (FileStream fs = new FileStream(fileName, FileMode.Open))
{
Coverbild.Image = Image.FromStream(fs);
CoverDateiname = fileName;
}
Wie schon angemerkt ist im allgemeinen using vorzuziehen und bei Image.FromStream-Methode: (Stream) darf der Stream nicht geschlossen werden.