Progressbar timer copy

  • VB.NET
  • .NET 5–6

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

    Progressbar timer copy

    Hallo,

    ich komme mit der Progressbar mit einem Timer nicht klar...

    Ich möchte eine 1,55 GB-große Datei von einem Quellordner in einen ZielOrdner kopieren und während des Vorgangs den Speicherplatz der beiden Ordner vergleichen.
    Wenn die Datei komplett in den Zielordner kopiert ist, dann soll die progressbar 100% haben (während des Vorgangs soll der Progressbar.Value den aktuellen Speicherplatz des Zielordners haben).

    Das Problem ist (glaube ich), dass der Kopiervorgang abgeschlossen wird und dann erst der Progressbarbalken durchläuft.

    Muss man das irgendwie parallel programmieren, dass der Kopiervorgang und die Speicherplatzabfrage parallel laufen?

    Leider habe ich da noch gar keine Erfahrung...

    Vielen Dank für die Hilfe im Voraus...

    Viele Grüße,

    kwon

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. Dim pfadB As String = "D:\a\zielOrdner\"
    5. Dim zielOrdner As New DirectoryInfo(pfadB)
    6. Dim speicherplatzQuellOrdner As Double
    7. Dim speicherplatzZielOrdner As Double
    8. Dim speicherplatzAnteilZielOrdner As Double
    9. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    10. Dim ProgressBar1 As New ProgressBar()
    11. Dim pfadA As String = "D:\a\quellOrdner\"
    12. Dim quellOrdner As New DirectoryInfo(pfadA)
    13. 'Progressbar
    14. ProgressBar1.Minimum = 0
    15. ProgressBar1.Maximum = 100
    16. Me.Timer1.Interval = 500
    17. Me.Timer1.Enabled = True
    18. Me.Timer1.Start()
    19. 'von quellOrdner nach zielOrdner kopieren
    20. FileCopy(pfadA & "testfilm.avi", pfadB & "testfilm.avi")
    21. 'Speicherplatz QuellOrdner (statisch = 1x ermitteln)
    22. speicherplatzQuellOrdner = getFolderSize(quellOrdner)
    23. speicherplatzQuellOrdner = Math.Round(speicherplatzQuellOrdner / (1024 * 1024 * 1024), 2)
    24. End Sub
    25. Function getFolderSize(folder As DirectoryInfo) As Long
    26. Dim speicherplatz As Long
    27. Dim files As String() = Directory.GetFiles(folder.FullName, "*.*", SearchOption.AllDirectories)
    28. For Each file As String In files
    29. Dim fileinfo As New FileInfo(file)
    30. speicherplatz += fileinfo.Length
    31. Next
    32. Return speicherplatz
    33. End Function
    34. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    35. Me.Timer1.Enabled = False
    36. End Sub
    37. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    38. 'Speicherplatz ZielOrdner (dynamisch = mit Timer ermitteln)
    39. speicherplatzZielOrdner = getFolderSize(zielOrdner)
    40. speicherplatzZielOrdner = Math.Round(speicherplatzZielOrdner / (1024 * 1024 * 1024), 2)
    41. 'SpeicherplatzAnteil ZielOrdner
    42. speicherplatzAnteilZielOrdner = Math.Round(speicherplatzZielOrdner / speicherplatzQuellOrdner, 2) * 100
    43. ProgressBar1.Value = speicherplatzAnteilZielOrdner
    44. If ProgressBar1.Value >= 100 Then
    45. Me.Timer1.Stop()
    46. Me.Timer1.Enabled = False
    47. End If
    48. End Sub
    49. End Class

    kwon schrieb:

    Muss man das irgendwie parallel programmieren, dass der Kopiervorgang und die Speicherplatzabfrage parallel laufen?
    Du musst den Kopiervorgang block-weise durchführen.
    Die Größe der Blöcke musst Du ausprobieren, Kriterien sind Geschwindigkeit und glatte Darstellung.
    Oder frage Frau Google nach csharp fileinfo.copy progress, da kommen einige interessante Lösungen:
    stackoverflow.com/questions/18…ng-fileinfo-copyto-in-net
    csharpforums.net/threads/updat…th-file-copy-status.7009/
    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!
    Hallo RodFromGermany,

    danke für die ausführliche Antwort!

    Ich bin mittlerweile auf dies gestoßen:

    VB.NET-Quellcode

    1. ​My.Computer.FileSystem.CopyDirectory("D:\progressbar\a\", "D:\progressbar\b\", FileIO.UIOption.AllDialogs, FileIO.UICancelOption.DoNothing)

    Das ergibt auch eine Progressbar und ist für meine Zwecke ausreichend...

    Danke nochmals...

    kwon schrieb:

    Visual Basic-Quellcode

    1. ​My.Computer.FileSystem
    kommt in meinem Sprachgebrauch nicht vor, weil das nicht .NET ist. Sorry,
    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!