Laden...

Bilder von Platte löschen aus WinForm

Erstellt von TigerCrow vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.982 Views
T
TigerCrow Themenstarter:in
86 Beiträge seit 2017
vor 6 Jahren
Bilder von Platte löschen aus WinForm

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

16.835 Beiträge seit 2008
vor 6 Jahren

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.

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo TigerCrow,

arbeite mit usings, dann sparst du dir die ganzen manuellen Disposing()-Aufrufe.

Gruss

Coffeebean

16.835 Beiträge seit 2008
vor 6 Jahren

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.

T
TigerCrow Themenstarter:in
86 Beiträge seit 2017
vor 6 Jahren

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

T
TigerCrow Themenstarter:in
86 Beiträge seit 2017
vor 6 Jahren

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

4.939 Beiträge seit 2008
vor 6 Jahren

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;
}

T
TigerCrow Themenstarter:in
86 Beiträge seit 2017
vor 6 Jahren

wo ist der vorteil? oder Nachteil?

Gruß
TigerCrow

D
152 Beiträge seit 2013
vor 6 Jahren

Wie schon angemerkt ist im allgemeinen using vorzuziehen und bei Image.FromStream-Methode: (Stream) darf der Stream nicht geschlossen werden.