Bild anzeigen und dann Bilddatei löschen

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Gelöschter Benutzer.

    Bild anzeigen und dann Bilddatei löschen

    Hallo,

    ich habe folgendes Problem, dass mich schon einige Zeit beschäftigt:

    Ich lade ein Bild in die Picturebox1

    VB.NET-Quellcode

    1. PictureBox1.ImageLocation = "d:\Bilder\Test1.jpg"

    Jetzt möchte ich die Datei löschen

    VB.NET-Quellcode

    1. File.Delete("d:\Bilder\Test1.jpg")

    Hier wird dann der Zugriff auf die Datei verweigert und es kommt zu einem Ausnahmefehler. Was ja logisch, weil das Bild noch angezeigt bzw. die Datei noch in Verwendung ist.

    Also vor dem Löschen, denke ich:

    VB.NET-Quellcode

    1. PictureBox1.ImageLocation = Nothing
    2. PictureBox1.Image = Nothing

    Ja, falsch gedacht. Der Zugriff wird auch hier verweigert.

    Wie kann ich die Bilddatei zum Löschen frei geben?
    Danke für Eure Tipps. Vieleicht habe ich mich ein wenig umständlich ausgedrückt. Ich möchte einfach, die zuvor in einer Picturebox geladene Bilddatei danach von der Festplatte ohne Fehlermeldung löschen.

    Versuche mal IsNothing. "=" ist hier nicht der richtige Operator.
    Wie muss das denn dann aussehen

    VB.NET-Quellcode

    1. PictureBox1.image IsNothing

    Irgendwie bekomme ich das nicht hin.

    VB.NET-Quellcode

    1. Dim BoxStream As New System.IO.FileStream("d:\Bilder\Test1.jpg"), IO.FileMode.Open)
    2. BoxStream.Close()

    Hier wird der Zugriff auch verweigert, da sich die bereits geladen in die PictureBox geladen wurde.

    VB.NET-Quellcode

    1. PictureBox1.Image.Dispose() 'Das Bild freigeben

    Geht leider auch nicht. Zugriff wird verweigert.

    Ich möchte Euch noch mitteilen, dass der Ordner "d:\Bilder" keine besonderen Benutzerrechte besitzt
    und ich mit meinen Programm Bilder löschen kann, die zuvor nicht von der PictureBox1 geladen wurden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gelöschter Benutzer“ ()

    Du musst das Image Disposen, so werden die Resourcen freigegeben.

    VB.NET-Quellcode

    1. Private Sub btn_ShowImage_Click(sender As System.Object, e As System.EventArgs) Handles btn_ShowImage.Click
    2. PictureBox1.BackgroundImage = Image.FromFile("Pfad")
    3. End Sub
    4. Private Sub btn_RemoveImage_Click(sender As System.Object, e As System.EventArgs) Handles btnRemoveImage.Click
    5. PictureBox1.BackgroundImage.Dispose()
    6. PictureBox1.BackgroundImage = Nothing
    7. IO.File.Delete("Pfad")
    8. End Sub
    Du musst das Image Disposen, so werden die Resourcen freigegeben.
    Ja, dann geht es. Leider ist dann auch die PictureBox1 verschwunden und kann für die Anzeige von weiteren Bilder nicht verwendet werden.

    VB.NET-Quellcode

    1. PictureBox1.BackgroundImage = Image.FromFile("Pfad")
    Ich lade das Bild einer Picturebox über Picturebox.ImageLocation im Programm, weil ich die Zoom-Funktion benutze. Du lädst das Bild über die BackgroundImage Anweisung, hier kann ich keine Zoom-Funktion nutzen. Deshalb komme ich mit deinem Vorschlag nicht wirklich zurecht. Gibt es noch eine andere Möglichkeit? Weil wie folgt geht es merkwürdigerweise nicht:

    VB.NET-Quellcode

    1. PictureBox1.Image.Dispose()
    2. PictureBox1.Image = Nothing
    Versuch mal in etwa so:

    VB.NET-Quellcode

    1. Private Sub DisplayImage(ByVal ptb As PictureBox, ByVal filename As String)
    2. If ptb.Image IsNot Nothing Then
    3. ptb.Image.Dispose()
    4. ptb.Image = Nothing
    5. End If
    6. If Not IO.File.Exists(filename) Then Return
    7. Dim bmp As Bitmap = Nothing
    8. Using fs As New IO.FileStream(filename, IO.FileMode.Open, IO.FileAccess.Read)
    9. bmp = CType(Image.FromStream(fs), Bitmap)
    10. End Using
    11. ptb.Image = bmp
    12. End Sub
    Dank Euren Tipps, Anregungen und durch viel herum probieren, glaube ich die Lösung gefunden zu haben:

    VB.NET-Quellcode

    1. 'Das geht ohne Fehlermeldung
    2. Dim MeinBild As String = "d:\Bilder\Test1.jpg"
    3. Dim BoxStream As New System.IO.FileStream(MeinBild, IO.FileMode.Open, FileAccess.Read)
    4. PictureBox1.Image = New Bitmap(BoxStream)
    5. BoxStream.Close()
    6. 'Weitere Prozeduren im Programm aufrufen, die nicht das Bild betreffen
    7. 'und dann Datei ohne Fehlermeldung löschen
    8. File.Delete(MeinBild)
    9. 'Das geht nicht
    10. Dim MeinBild As String = "d:\Bilder\Test1.jpg"
    11. PictureBox1.ImageLocation = MeinBild
    12. 'Weitere Prozeduren im Programm aufrufen, die nicht das Bild betreffen
    13. 'und dann kann die Datei NICHT gelöscht werden, denn der Zugriff wird
    14. 'verweigert
    15. PictureBox1.Image.Dispose()
    16. PictureBox1.Image = Nothing
    17. PictureBox1.ImageLocation = Nothing
    18. File.Delete(MeinBild)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Gelöschter Benutzer“ ()