Objekt wieder freigeben für DeleteFile

  • VB.NET
  • .NET 4.5

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Objekt wieder freigeben für DeleteFile

    Hallo Zusammen,ich kämpfe seit Tagen mit meiner Picturebox.
    Ich kopiere Bilder in ein Arbeitspfad und lösche diese wieder wenn ich diese Bilder angezeigt habe.
    Dann fängt alles wieder von vorne an.
    Problem ist nur, dass ich DeleteFile nicht erneut aufrufen kann, da irgendwas mich blockt.
    Habe versucht alle Verweise auf die Picturebox zu lösen, aber irgendwie komm ich so nicht weiter...
    Vielleicht kann mir da jemand helfen.
    Danke

    VB.NET-Quellcode

    1. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    2. Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
    3. Dim images_Screen As New List(Of Image)
    4. Dim index_Screen As Integer
    5. Do 'Until worker.CancellationPending = True
    6. If worker.CancellationPending = True Then
    7. e.Cancel = True
    8. Exit Do
    9. End If
    10. ' Lösche Bilder
    11. Try
    12. For Each foundFile As String In My.Computer.FileSystem.GetFiles(tempPfad_Screen, Microsoft.VisualBasic.FileIO.SearchOption.SearchTopLevelOnly, "*.jpg")
    13. My.Computer.FileSystem.DeleteFile(foundFile)
    14. Next
    15. Catch ex As Exception
    16. End Try
    17. ' Kopiere den Bildschirmschoner vom Copy in Temp
    18. Try
    19. For Each foundFile As String In My.Computer.FileSystem.GetFiles(Pfad_Copy_Screen, Microsoft.VisualBasic.FileIO.SearchOption.SearchTopLevelOnly, "*.jpg")
    20. My.Computer.FileSystem.CopyFile(foundFile, tempPfad_Screen & "\" & My.Computer.FileSystem.GetName(foundFile), True)
    21. Next
    22. Catch ex As Exception
    23. End Try
    24. ' Fülle Liste mit Bildern
    25. Try
    26. For Each Datei As String In My.Computer.FileSystem.GetFiles(tempPfad_Screen, FileIO.SearchOption.SearchTopLevelOnly, "*.jpg")
    27. images_Screen.Add(Image.FromFile(Datei))
    28. Next
    29. Catch ex As Exception
    30. End Try
    31. ' Zeige Lister der Bilder nach Zeit nacheinander an
    32. Do Until index_Screen = images_Screen.Count
    33. If images_Screen.Count > 0 Then
    34. If index_Screen >= images_Screen.Count Then
    35. index_Screen = 0
    36. End If
    37. worker.ReportProgress(100, "Nächstes Bild")
    38. System.Threading.Thread.Sleep(Zeit_Bildschirmschoner)
    39. pb_Screener.Image = Nothing
    40. pb_Screener.Image = images_Screen(index_Screen)
    41. index_Screen += 1
    42. End If
    43. Loop
    44. 'Aufräumen und Objecte frei geben
    45. pb_Screener.Image = Nothing
    46. images_Screen.Clear()
    47. index_Screen = 0
    48. 'Beweg mal den Cursor, um Win-Bildschirmschoner nicht anzusprechen
    49. Cursor.Position = New Point(nScreenWidth, nScreenHeight)
    50. Loop
    51. End Sub



    Fehler bei execption bei DeleteFile bei erneuten Durchlauf
    ​ {System.IO.IOException: Der Prozess kann nicht auf die Datei "C:\temp\Bildschirmschoner\0000-PSA Erweiterung - Kopie (2).jpg" zugreifen, da sie von einem anderen Prozess verwendet wird. bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) bei System.IO.File.InternalDelete(String path, Boolean checkHost) bei System.IO.File.Delete(String path) bei Microsoft.VisualBasic.FileIO.FileSystem.DeleteFileInternal(String file, UIOptionInternal showUI, RecycleOption recycle, UICancelOption onUserCancel) bei Microsoft.VisualBasic.MyServices.FileSystemProxy.DeleteFile(String file) bei WhiteBoard_Schlosserei.Whiteboard.BackgroundWorker1_DoWork(Object sender, DoWorkEventArgs e) In H:\NET Programmierung\WhiteBoard-Schlosserei\WhiteBoard-Schlosserei\Haupt.vb:Zeile 586.}
    Das mit Image.FromStream funktioniert prima für Bilder.

    Wie gehe ich vor bei PDF Dateien?


    VB.NET-Quellcode

    1. Private PDFs_Frame2 As New List(Of String)
    2. Try
    3. For Each foundFile As String In My.Computer.FileSystem.GetFiles(tempPfad_Screen, Microsoft.VisualBasic.FileIO.SearchOption.SearchTopLevelOnly, "*.PDF")
    4. Dim fs As New FileStream(foundFile, FileMode.Open, FileAccess.Read)
    5. PDF_Frame2.Add(???.FromStream(fs))
    6. fs.Close()
    7. fs.Dispose()
    8. Next
    9. Catch ex As Exception
    10. MsgBox("Fehler" & ex.ToString)
    11. End Try


    was gibt es da für eine Vorgehensweise?

    Danke nochmals
    ich bastel gerade ein Digitales Whiteboard.
    Es werden verschiedene Frames angezeigt mit div. Informationen
    Ein Frame war nur mit Bildern (siehe erster Beitrag) die anderen Frames zeigen mir div. PDFs an aus verschiedenen Verzeichnissen.

    Ich habe eine PDF-Viewer DLL von e-iceblue.com
    Diese kann direkte Pfadangaben per PdfDocumentViewer1.LoadFromFile oder per Stream PdfDocumentViewer1.LoadFromStream anzeigen.

    Dort holt mich die Problematik dann auch ein mit den Objekt wieder freigeben.

    Hatte so mal probiert, aber leider wäre dann PdfDocumentViewer1 ein threadübergreifender Aufruf und so geht's in die Exception:

    VB.NET-Quellcode

    1. Try
    2. For Each Dateien As String In My.Computer.FileSystem.GetFiles(tempPfad_PDF1, FileIO.SearchOption.SearchTopLevelOnly, "*.PDF")
    3. Dim fileBytes() As Byte = File.ReadAllBytes(Dateien)
    4. Using ms As New MemoryStream(fileBytes)
    5. PdfDocumentViewer1.LoadFromStream(ms)
    6. End Using
    ok dann versuch ich mal einen bei Laufzeit zu erstellen und schließen. mal gucken wie ;)

    EDIT:
    Also in Form_Load habe ich per das Objekt gesetzt

    VB.NET-Quellcode

    1. Dim PdfDocumentViewer11 As New Spire.PdfViewer.Forms.PdfDocumentViewer()
    2. Private Sub Haupt_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Me.Controls.Add(PdfDocumentViewer11)
    4. End Sub
    5. Private Sub BackgroundWorker2_DoWork(ByVal sender As System.Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorker2.DoWork
    6. Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
    7. With PdfDocumentViewer11
    8. .Location = New Point(0, 0)
    9. End With
    10. Try
    11. For Each Dateien As String In My.Computer.FileSystem.GetFiles(tempPfad_PDF1, FileIO.SearchOption.SearchTopLevelOnly, "*.PDF")
    12. Dim fileBytes() As Byte = File.ReadAllBytes(Dateien)
    13. 'Dim ms As New MemoryStream(File.ReadAllBytes(Dateien))
    14. Using ms As New MemoryStream(fileBytes)
    15. PdfDocumentViewer11.LoadFromStream(ms)
    16. End Using
    17. End Sub


    dann steigt er mir wieder mit Threadübergreifenden Fehler aus

    VB.NET-Quellcode

    1. {System.InvalidOperationException: Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
    2. bei System.Windows.Forms.Control.get_Handle()
    3. bei System.Windows.Forms.Control.set_Cursor(Cursor value)
    4. bei Spire.PdfViewer.Forms.PdfDocumentViewer.᜜()
    5. bei Spire.PdfViewer.Forms.PdfDocumentViewer.LoadFromStream(Stream stream)
    6. bei WhiteBoard_Schlosserei.Whiteboard.BackgroundWorker2_DoWork(Object sender, DoWorkEventArgs e) in H:\NET Programmierung\WhiteBoard-Schlosserei\WhiteBoard-Schlosserei\Haupt.vb:Zeile 733.}


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

    Und warum machst du das überhaupt in einem Backgroundworker?
    Schmeiß den mal weg, und schaub ob es dann funktioniert.
    Post-AGB:
    §1 Mit dem Lesen dieses Posts stimmst du den AGB unverzüglich zu
    §2 Ein Widerruf muss innerhalb von 3 Sekunden nach Lesen des Hauptbestandteil des ersten jemals gelesenen Posts erfolgen
    Abs.1 Die Signatur zählt nicht zum Hauptbestandteil des Posts
    §3 Ein erfolgreicher Widerruf zwingt zu einem Besuch bei einem Hypnotiseur oder Neurochirurg, sodass der gelesene Text aus den Erinnerungen entfernt werden kann
    Abs.1 Die Kosten und Risiken sind jeweils selbst zu tragen
    @Polecat Auf GUI-Elemente kannst Du nur aus dem GUI-Thread heraus zugreifen.
    Wenn Du im BGW GUI-Elemente befüllst, knallt das selbstverständlich.
    Das musst Du dann anders organisieren.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Beschreib mal, was da passieren soll.
    Zunächst musst Du das ganze im GUI-Thread zum Laufen bringen.
    Das Befüllen von Controls kann man beschleunigen, indem man dem Control verbietet, sich während der Befüllung upzudaten:

    VB.NET-Quellcode

    1. ctrl.SuspendLayout()
    2. ' befüllen
    3. ctrl.ResumeLayout(False)
    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).
    VB-Fragen über PN / Konversation werden ignoriert!