Datei wird verwendet - nur wo ?

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von Andi2572.

    Datei wird verwendet - nur wo ?

    Servus

    Ich habe schon wieder ein Problem. Ich lade in ein FlowLayoutpanel mehrere Pictureboxen und lass mir dort Bilder anzeigen. Jetzt möchte ich wenn ich eine Picturebox lösche auch die Datei löschen. Nur dann bekomme ich immer den Fehler, dass die Datei verwendet wird. Leider weiß ich überhaupt nicht, wo sie verwendet werden könnte, weil sie nirgens geladen wird.

    So lösche ich meine Pictureboxen:

    VB.NET-Quellcode

    1. pb.Image.Dispose()
    2. pb.Image = Nothing
    3. File.Delete(Pfad)


    Wie könnte ich aber herausfinden wo die Datei verwendet wird ?

    MFG Andi2572
    Warum die Datei löschen?
    Dies genügt völlig:

    VB.NET-Quellcode

    1. PictureBox1.Image = Nothing
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @FreakJNS:
    So generiere ich meine Pictureboxen:

    VB.NET-Quellcode

    1. Public Sub loadnewpatient(ByVal folder As String)
    2. ' FlowLayoutPanel1.Controls.Clear()
    3. For Each ext As String In Split("*.jpg;*.jpeg;*.gif;*.bmp;", ";")
    4. For Each file As FileInfo In New DirectoryInfo(folder).GetFiles(ext)
    5. pb = New PictureBox
    6. pb.Image = Image.FromFile(folder & "\" & file.ToString)
    7. pb.Name = folder & "\" & file.ToString
    8. FlowLayoutPanel1.Controls.Add(pb)
    9. pb.Size = New Size(180, 110)
    10. pb.SizeMode = PictureBoxSizeMode.Zoom
    11. AddHandler pb.Click, AddressOf pb_Click
    12. AddHandler pb.DoubleClick, AddressOf pb_DoubleClick
    13. AddHandler pb.MouseDown, AddressOf pb_MouseDown
    14. AddHandler pb.MouseMove, AddressOf pb_MouseMove
    15. AddHandler pb.MouseHover, AddressOf pb_MouseHover
    16. Next
    17. Next
    18. End Sub


    Und dann möchte ich eben eine Picturebox löschen und auch gleich die Datei.
    Das funktioniert nicht. (Der Code ist oben beschrieben)

    @Cyruxx
    Darum dachte ich pb.Image.Dispose()

    @RodFromGermany
    Ich möchte ja, dass das Bild nicht mehr im Speicher(?) ist und somit verwendet wird. Die Datei soll ja dadurch gelöscht werden.

    MFG Andi2572
    Imo ist das da übelstes gebastel. Du hinterlegst den Pfad im Namen eines Controls?! wtf xD
    Du hast das Problem, dass du mehre Informationen die in einem Zusammenhang stehen halten musst, einmal das Bild und zum anderen die Pfadangabe (noch besser: FileInfo). Statt eines solchen gebastels würde ich mir eine Klasse anlegen, die die entsprechenden Properties hat.
    So hättest du die Daten schonmal von der GUI getrennt. Einen Schritt weiter würde ich ein UserControl erstellen (das kann auch ein Control sein, dass von Picturebox erbt), dass darauf spezialisiert ist die Daten der Klasse anzuzeigen und zu verarbeiten. Anzeigen heißt, es zeigt das Bild an, und verarbeiten, dass du z.b. durch Klicken auf einen Button des Controls (oder per doppelklick, kp wie du das machen willst) das löschen veranlassen kannst.

    Weitere Tipps:
    - zum verbinden von Pfaden die IO.Path.Combine-Funtkion verwenden
    - "File.FullName" verwenden statt "folder & "\" & file.ToString"
    - Option Stric On (falls noch nicht geschehen)

    btw: habe das ganze mal getestet, bei mir Funktioniert das Löschen der Bilder (auch der Dateien) einwandfrei


    hast du vllt keine Admin-Rechte? Starte das VisualStudio als Admin, dann sollte das ausgeschlossen sein.

    Andi2572 schrieb:

    Die Datei soll ja dadurch gelöscht werden.
    Wo kommt denn die Datei her?
    Was machst Du beim nächsten Programmstart?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Okay FreakJNS! Danke schonmal !
    Dann werde ich das alles mal berücksichtigen und mich dann wieder melden, wenn ich vor Problemen stehe! (Programmiere übrigens immer Strict on ;) )
    Jedoch hätte ich noch eine Frage: Wie bastel ich mir so eine Klasse? Hab das bisher noch nie gemacht. Kannst du mir da Tipps, Tutorials oder Threads geben, bzw zeigen?

    @RodFromGermany

    Die Datei nehme ich mit einer USB Kamera auf. Beim nächsten Programmstart werden die Bilder wieder angezeigt. Nur ohne den gelöschten Bildern

    MFG Andi2572

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Andi2572“ ()

    Andi2572 schrieb:

    Die Datei nehme ich mit einer USB Kamera auf.
    Solch unwichtige Sachen hätte ich auch nicht geschrieben, bevor jemand nachfragt.
    Du kannst die letzte Datei löschen, wenn Du die nächste zugewiesen hast.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Aber das funktioniert doch nicht. pb.Image = Nothing heißt doch, dass die Picturebox kein Bild hat und bei pb.Image.Dispose() wirft man doch das Bild aus dem Speicher. Dann müsste ich es doch auch löschen können, weils nicht mehr verwendet wird?!

    MFG Andi2572
    Den aktuellen Code, wie Deine Kamerabilder zur Anzeige gebracht werden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Andi2572 schrieb:

    bei pb.Image.Dispose() wirft man doch das Bild aus dem Speicher

    Nein.
    Damit ruft man die Dispose Methode auf. Aus dem "Speicher" wird etwas erst entfernt, wenn der GC es rausschmeißt. Außerdem implementieren manche Sachen "Finalize" und zu finalisierende Objekte leben zwei Mal.

    Verstehe aber nicht wo das Problem liegt. Lies die Datei am Stück ein, als Array etc, und weise DAS dann als Bild zu. Damit ist die Ursprungsdatei nur einmal kurz geöffnet und danach kann sie gelöscht, verändert etc werden.

    EDIT:
    siehe zb auch: stackoverflow.com/questions/16…-release-handle-on-a-file
    So mache ich ein Bild:

    VB.NET-Quellcode

    1. Dim bild As Image = New Bitmap(PictureBox1.Image)
    2. Dim g As Graphics = Graphics.FromImage(bild)
    3. g.DrawImage(bild, 0, 0)
    4. ' Draw a string on the PictureBox.
    5. g.DrawString((FormatDateTime(Date.Today, DateFormat.ShortDate) & vbCrLf & FormatDateTime(TimeOfDay)), New Font("Times New Roman", 7), Brushes.Red, New PointF(5.0F, 275.0F))
    6. PictureBox1.Image = bild
    7. With DGV.Rows(DGV.CurrentRow.Index)
    8. 'MsgBox(Application.StartupPath & "\Patienten\" & .Cells(0).Value.ToString & "_" & .Cells(2).Value.ToString & "\" & Nummer & "_" & .Cells(0).Value.ToString & "_" & .Cells(2).Value.ToString & "_" & Date.Today & "_" & Date.Now.Hour & "_" & Date.Now.Minute & "_" & Date.Now.Second & ".jpg")
    9. 'Exit Sub
    10. PictureBox1.Image.Save(Application.StartupPath & "\Patienten\" & .Cells(0).Value.ToString & "_" & .Cells(2).Value.ToString & "\" & BildNummer & "_" & .Cells(0).Value.ToString & "_" & .Cells(2).Value.ToString & "_" & Date.Today & "_" & Date.Now.Hour & "_" & Date.Now.Minute & "_" & Date.Now.Second & ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
    11. Modul.checkpic(Application.StartupPath & "\Patienten\" & .Cells(0).Value.ToString & "_" & .Cells(2).Value.ToString & "\" & BildNummer & "_" & .Cells(0).Value.ToString & "_" & .Cells(2).Value.ToString & "_" & Date.Today & "_" & Date.Now.Hour & "_" & Date.Now.Minute & "_" & Date.Now.Second & ".jpg", Label1)
    12. End With


    Aber das ist eine ganz andere Picturebox. Ich lade alle Bilder von der Datei in die pb.

    MFG Andi2572

    Andi2572 schrieb:

    Aber das ist eine ganz andere Picturebox.
    Junge - das ist Dein Thread, Du hast ein Problem und bittest uns um Hilfe.
    Lass Dir nicht jede Information aus der Nase ziehen, arbeite konstruktiv mit. Wenn Dein Programm hardwarebasiert ist, musst Du davon ausgehen, dass nur 99,7 % der Forum-Mitglieder Dir helfen können, die anderen haben keine Kamera greifbar.
    Also poste mal etwas mehr Code, insbesondere auch die Namen und insbesondere die Signaturen der betreffenden Prozeduren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Aber alles was mit den Picutreboxen zu tun hat ist nunmal nur das in Thread 1 und 5. Und ich wollte wissen, wie man die Picturebox und die Datei löscht.
    Die Dateien haben solche namen: 1_1_Huber_26.03.2012_14:44:54.jpg

    MFG Andi2572
    Wenn das anzuzeigende Bild als Datei vorliegt, dann lade sie mal durch die Imagelocation-Eigenschaft, und nicht durch die Image-Eigenschaft. Dann solt's auch mit dem Löschen klappen.
    Ausserdem: hör' auf die Leute, die dir die IO.Path.Combine-Methode empfehlen.

    VB.NET-Quellcode

    1. 'vorher:
    2. pb.Image = Image.FromFile(folder & "\" & file.ToString)
    3. 'nachher:
    4. pb.ImageLocation = io.path.combine(folder, file.ToString)