Prozess greift noch auf eine Datei zu, wo ?

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ic3y.

    Prozess greift noch auf eine Datei zu, wo ?

    Hallo,
    ich hoffe ihr könnt einem Kollegen von mir helfen. Er hat vor kurzem mit Vb08 angefangen, daher ist die Struktur noch sehr eigenartig.
    Ich finde leider den Fehler nicht, habe aber selbst noch nicht so viel Erfahrung und hoffe, ihr wisst was zu tun ist.


    menuscr
    nopaste.info/de059960f6_nl.html

    menuclean:
    nopaste.info/7738c19225_nl.html

    Also das Problem ist, menuscr zeigt Screenshots aus einem Ordner an. Menuclean leert diesen Ordner.
    Ruft er zuerst menuclean auf, kann er ihn leeren. Ruft er erst menuscr auf und dann menuclean, kriegt er den Fehler, das ein Bild von einem Prozess belegt ist.

    Und er weiß leider nicht, woran es liegt und ich kann ihm da auch nicht weiterhelfen.

    Danke schonmal und Greetz

    - ic3y

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

    Das Problem ist folgendes:
    In menuscr.ListBox1_SelectedIndexChanged(...) lädst du bei jedem neu ausgewählten Eintrag der ListBox ein Bild in eine PictureBox (.Image = New Bitmap(...)). Wird nun ein neuer Eintrag ausgewählt, wird die Image-Eigenschaft mit einem neuen Bild überschrieben. Gleichzeitig geht die Referenz auf das alte Bild verloren. Da New Bitmap(String) die übergebene Datei zum Lesen öffnet und nicht von selbst schließt (das ist so gewollt), geht dir dadurch auch das Dateihandle verloren. Die Datei bleibt geöffnet, bis das Objekt vom GC eingesammelt wird. Das tut er aber erst, wenn der Speicher knapp wird oder die Anwendung beendet wird. Die Lösung ist trivial:

    Speichere das Dateihandle und gib es vor dem Laden eines neuen Bildes frei:

    VB.NET-Quellcode

    1. Dim hFile As FileStream = Nothing
    2. Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbscr.SelectedIndexChanged
    3. pbview.SizeMode = PictureBoxSizeMode.StretchImage 'Dieser Aufruf ist m.E. nicht jedes Mal erforderlich (im Designer setzen!)
    4. 'alte Ressourcen freigeben
    5. If pbview.Image IsNot Nothing Then
    6. pbview.Image.Dispose()
    7. hFile.Close()
    8. End If
    9. hFile = New FileStream(pbpath & "pballscrnshot" & lbscr.Text) 'OpenMode ergänzen (Read reicht)
    10. pbview.Image = New Bitmap(hFile)
    11. End Sub

    Bevor du den Reinigungsvorgang startest, musst du natürlich das letzte Bild auch noch freigeben, sonst hast du wieder dasselbe Problem.
    Gruß
    hal2000