Bilddatei löschen, Fehler weil angezeigt

Basinski

Grünschnabel
Hallo!

Ich habe eine Liste von Bildern in einer Listview geladen.
Das klappt auch ganz gut. Wählt man ein Bild aus, so bekommt man neben der
ListView auch noch in einer PicBox das Bild angezeigt.
Dieses lade ich beim Klicken auf die ListView..
Code:
            Dim Img As Image = Image.FromFile(Me.lvFronten.SelectedItems.Item(0).Name)
            Me.PicBoxFront.Image = Img

Nun möchte ich ein Bild via Code physisch von der Platte löschen, was eigentlich mit

Code:
My.Computer.FileSystem.DeleteFile(DATEINAME)

keinen großen Akt darstellt, aber solange ich das Bild in der PicBox darstelle bekomme ich folgenden Fehler:

Der Prozess kann nicht auf die Datei bla bla bla zugreifen, da sie von einem anderen Prozess gesperrt ist.

Ich habe schon verucht im Code die PicBox auf blank zu setzen und mit dispose
freizugeben, aber alles kein erfolg.

Hat einer eine Idee wie ich das hinbekomme****

Gruß
Sascha
 
HI!
Hab de Artikel mal gelesen und folgendes gebaut:

Zuerst lade ich die Grafiken in meine ImageList und für die Einträge in die Listview hinzu.
Hierzu hab ich mir noch eine Hilfs-Funktion gebaut, welche mir die Grafiken aus dem Stream laden.

Code:
 Sub LadeGrafiken()
        'Frontansicht laden
        Dim Sql As String = "Select * from SchnittFront where KopfID= '" & Me.Key.ToString & "'"
        Dim DR As OleDb.OleDbDataReader = Funktionen.GetResultfromDB(Sql)
        If DR.HasRows Then
            Dim callback As GetThumbnailImageAbort
            Me.lvFronten.Items.Clear()
            Me.ImgListFronten.Images.Clear()
            While DR.Read
                Dim Datei As String = frmStart.PathSchnitte & "\" & Me.Key & "\" & DR(2).ToString
                Dim erstellt As String = DR(5).ToString & " von " & DR(4).ToString
                Dim TB As Image = Gfx.SImage(Datei).GetThumbnailImage(80, 120, callback, New IntPtr())
                Me.ImgListFronten.Images.Add(TB)
                Me.lvFronten.Items.Add(Datei, DR(3).ToString & vbCrLf & erstellt, ImgListFronten.Images.Count - 1)
                Dim LI As ListViewItem = lvFronten.Items(lvFronten.Items.Count - 1)
                LI.Tag = DR(0).ToString
                TB.Dispose()
            End While
        End If
    End Sub


    Public Shared Function SImage(ByVal FileName As String) As Image
        Dim FS As New FileStream(FileName, FileMode.Open, FileAccess.Read)
        Dim TempImage As Image = Image.FromStream(FS)
        Dim RetImage As Image = New Bitmap(TempImage)
        Return RetImage
        TempImage.Dispose()
        RetImage.Dispose()
    End Function

Ergebnis:

Die Anwendung läuft jetzt bis zu dem Punkt wo ich die Form aufrufe wo die Grafiken angezeigt werden sollen.

Jetzt kommt es zum Abbruch:
Eine nicht behandelte Ausnahme des Typs "System.ArgumentException" ist in System.Windows.Forms.dll aufgetreten.

Zusätzliche Informationen: Ungültiger Parameter.

VB kann nicht mal zum Quellcode springen, es wird nur angezeigt:" Keine Quelle verfügbar"

Also das war mal nix, hat noch jemand eine Idee eine Grafik zu laden ohne das ein Handle auf der Datei bleibt, so das man diese auch löschen kann****?

Gruß
Sascha
 
Soo.. ich hab noch mal ein bisschen im Web gesucht und hab den Code meiner kleinen Hilfsfunktion ein wenig angepasst:

Code:
    Public Shared Function SImage(ByVal FileName As String) As Image
        If My.Computer.FileSystem.FileExists(FileName) Then
            Dim ImageFileStream As FileStream = New FileStream(FileName, FileMode.Open, FileAccess.Read)
            Dim byteArray(ImageFileStream.Length) As Byte
            ImageFileStream.Read(byteArray, 0, ImageFileStream.Length)
            ImageFileStream.Close()

            Dim memoryStr As New MemoryStream(byteArray)
            Return Image.FromStream(memoryStr)


            'Dim FS As New FileStream(FileName, FileMode.Open, FileAccess.Read)
            'Dim TempImage As Image = Image.FromStream(FS)
            'Dim RetImage As Image = New Bitmap(TempImage)
            'Return RetImage
            'TempImage.Dispose()
            'RetImage.Dispose()
        Else
            Return RVS.My.Resources.no_image
        End If
    End Function

Mit dem Lesen des Bildes aus dem Stream / Bytearray bleibt kein Prozess offen und man kann ein Bild anzeigen und es auch trotzdem im Hintergrund löschen!

Falls es mal jemanden helfen sollte, so klappts auf jeden fall!

Gruß
Sascha
 
Da ich das Thema nicht wirklich erledigt finde, da ja das im ersten Post erwähnte Verhalten nicht sein darf habe ich mir mal den Sourcecode von Image.FromFile angeschaut und dabei gesehen, dass das .NET Framework hier überhaupt nichts macht. Alles wird an GDI+ abgegeben und die aus der gdplus.dll exportierte Funktion GdipLoadImageFromFile aufgerufen. Diese schliesst in jedem Fall den einzigen Handle auf die Datei einwandfrei und arbeitet nacher nur noch mit einem IStream. Aus diesem Grund konnte ich auch bei folgendem Code kein Problem feststellen:
C#:
            for (uint i = 0; i < 1000; ++i)
            {
                Image img = Image.FromFile("C:\\Users\\Admin\\Pictures\\wcf.png");
                img.Dispose();
                System.IO.File.Delete("C:\\Users\\Admin\\Pictures\\wcf.png");
                System.IO.File.Copy("C:\\Users\\Admin\\Desktop\\wcf.png", "C:\\Users\\Admin\\Pictures\\wcf.png");
                System.Threading.Thread.Sleep(20);
            }

Der Fehler muss da noch irgendwo anders liegen!
 

Neue Beiträge

Zurück