Bei Async Copy Progressbar anzeigen

  • VB.NET

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von Bluespide.

    @RodFromGermany nein :) Mit Option Strict ON
    @ErfinderDesRades nein :) Mit Option Strict ON

    Mal zwischen durch was anderes... ich bin auf der Suche nach der 7zip SDK für VB.Net...
    Finde jedoch nur eine für CS?!
    Gibt es die überhaupt?
    Ich habe schon häufiger heute hier im Board sevenzip gelesen,... ist das das gleiche?
    Nein! Doch! OHH!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „samson“ ()

    samson schrieb:

    Private Function CopyFile(srcName As String, destName As String)
    ist Strict Off.
    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!
    @Facebamm Werde ich gerne Posten... Aktuell bekomme ich leider bei Dateien über 4GB schon eine Exception...
    Der Code ist von ErfinderDesRades, an dieser Stelle nochmal ein herzliches Dankeschön!

    Spoiler anzeigen
    Informationen über das Aufrufen von JIT-Debuggen
    anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.

    ************** Ausnahmetext **************
    System.OverflowException: Die arithmetische Operation hat einen Überlauf verursacht.
    bei Manuelle_Sicherung.Main.VB$StateMachine_26_Button1_Click.MoveNext()
    --- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
    bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

    ************** Geladene Assemblys **************
    mscorlib
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3163.0 built by: NET472REL1LAST_C.
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll.
    ----------------------------------------
    Manuelle_Sicherung
    Assembly-Version: 1.0.0.0.
    Win32-Version: 1.0.0.0.
    CodeBase: file:///C:/Users/Jupitec/Desktop/Manuelle Sicherung.exe.
    ----------------------------------------
    Microsoft.VisualBasic
    Assembly-Version: 10.0.0.0.
    Win32-Version: 14.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll.
    ----------------------------------------
    System
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3151.0 built by: NET472REL1LAST_B.
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll.
    ----------------------------------------
    System.Core
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3160.0 built by: NET472REL1LAST_C.
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll.
    ----------------------------------------
    System.Windows.Forms
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.
    ----------------------------------------
    System.Drawing
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.
    ----------------------------------------
    System.Configuration
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll.
    ----------------------------------------
    System.Xml
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll.
    ----------------------------------------
    System.Runtime.Remoting
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll.
    ----------------------------------------
    System.ServiceProcess
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.ServiceProcess/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.ServiceProcess.dll.
    ----------------------------------------
    mscorlib.resources
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_de_b77a5c561934e089/mscorlib.resources.dll.
    ----------------------------------------
    System.Windows.Forms.resources
    Assembly-Version: 4.0.0.0.
    Win32-Version: 4.7.3056.0 built by: NET472REL1.
    CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_de_b77a5c561934e089/System.Windows.Forms.resources.dll.
    ----------------------------------------

    ************** JIT-Debuggen **************
    Um das JIT-Debuggen (Just-In-Time) zu aktivieren, muss in der
    Konfigurationsdatei der Anwendung oder des Computers
    (machine.config) der jitDebugging-Wert im Abschnitt system.windows.forms festgelegt werden.
    Die Anwendung muss mit aktiviertem Debuggen kompiliert werden.

    Zum Beispiel:

    <configuration>
    <system.windows.forms jitDebugging="true" />
    </configuration>

    Wenn das JIT-Debuggen aktiviert ist, werden alle nicht behandelten
    Ausnahmen an den JIT-Debugger gesendet, der auf dem
    Computer registriert ist, und nicht in diesem Dialogfeld behandelt.


    Leider ist mir diese noch nicht bekannt, ich vermute jedoch es hat was mit der Progressbar zutun.

    Hier der Code:

    Buttonfunktion Async

    VB.NET-Quellcode

    1. Private Async Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_dasi.Click
    2. bt_target.Enabled = False
    3. bt_dasi.Enabled = False
    4. lbl_count.Text = "30"
    5. lbl_count.Visible = True
    6. Timer2.Enabled = True
    7. stop_mo()
    8. Await Task.Delay(30000)
    9. stop_services()
    10. Await Task.Delay(10000)
    11. check_stopped()
    12. If My.Computer.FileSystem.DirectoryExists(fbd_dir.SelectedPath & "\Manuelle_Sicherung") Then
    13. pb_start_copy.Visible = True
    14. lbl_start_copy.Visible = True
    15. pb_hourglass.Visible = True
    16. ProgressBar1.Value = ProgressBar1.Minimum
    17. Dim fiSrc = New FileInfo(datapath + "\datenbank.gdb")
    18. ProgressBar1.Maximum = CInt(fiSrc.Length)
    19. ProgressBar1.Visible = True
    20. _Progress = New Progress(Of Integer)(AddressOf ProgressBar1.Increment)
    21. Await Task.Run(Sub() CopyFile(fiSrc, fbd_dir.SelectedPath & "\Manuelle_Sicherung\datenbank.gdb"))
    22. ProgressBar1.Hide()
    23. pb_hourglass.Visible = False
    24. pb_db_copy.Visible = True
    25. lbl_db_copy.Visible = True
    26. Else
    27. pb_start_copy.Visible = True
    28. lbl_start_copy.Visible = True
    29. My.Computer.FileSystem.CreateDirectory(fbd_dir.SelectedPath & "\Manuelle_Sicherung")
    30. pb_hourglass.Visible = True
    31. ProgressBar1.Value = ProgressBar1.Minimum
    32. Dim fiSrc = New FileInfo(datapath + "\datenbank.gdb")
    33. ProgressBar1.Maximum = CInt(fiSrc.Length)
    34. ProgressBar1.Visible = True
    35. _Progress = New Progress(Of Integer)(AddressOf ProgressBar1.Increment)
    36. Await Task.Run(Sub() CopyFile(fiSrc, fbd_dir.SelectedPath & "\Manuelle_Sicherung\datenbank.gdb"))
    37. ProgressBar1.Hide()
    38. pb_hourglass.Visible = False
    39. pb_db_copy.Visible = True
    40. lbl_db_copy.Visible = True
    41. End If
    42. lbl_start_services.Visible = True
    43. remove_stop()
    44. start_services()
    45. Await Task.Delay(3000)
    46. check_start()
    47. Timer1.Enabled = True
    48. MessageBox.Show("Datensicherung erfolgreich beendet! Das Programm wird nun beendet!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information)
    49. Application.Exit()
    50. End Sub


    Progress Informationen

    VB.NET-Quellcode

    1. Private _Progress As IProgress(Of Integer)
    2. Private Sub CopyFile(fiSrc As FileInfo, destName As String)
    3. Using src = fiSrc.Open(FileMode.Open), dest = New FileStream(destName, FileMode.Create)
    4. Dim buf(4095) As Byte
    5. Dim read = buf.Length
    6. While read = buf.Length
    7. read = src.Read(buf, 0, read)
    8. _Progress.Report(read)
    9. dest.Write(buf, 0, read)
    10. End While
    11. End Using
    12. End Sub
    Nein! Doch! OHH!
    Das If in Button1_Click musste unbedingt nochmal überarbeiten. Da steht ja 2 mal dasselbe! das geht garnet.
    Vermutlich gibts ein Detail-Unterschied, den ich grad nicht sehe (also nur dann macht das If ja ühaupt Sinn).
    Arbeite es so um, dass die Code-Wiederholungen eliminiert sind.
    Was in beiden Zweigen gleich ist, kann man ja vor oder Nach dem IF verschieben.
    So halbiert sich (fast) die Code-Menge, und die Unterschiede der If-Zweige werden ersichtlich, und damit erscheint der Code erst sinnvoll.
    @ErfinderDesRades Danke für den Tipp, hab es mal "gestutzt". In der IF gehts nur darum ob der Ordner schon vorhanden ist.
    Hier der neue Code, Fehler bleibt leider der Gleiche, wenn die Datei zu groß ist...

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Async Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_dasi.Click
    2. bt_target.Enabled = False
    3. bt_dasi.Enabled = False
    4. lbl_count.Text = "30"
    5. lbl_count.Visible = True
    6. Timer2.Enabled = True
    7. stop_mo()
    8. Await Task.Delay(30000)
    9. stop_services()
    10. Await Task.Delay(10000)
    11. check_stopped()
    12. If Not My.Computer.FileSystem.DirectoryExists(fbd_dir.SelectedPath & "\Manuelle_Sicherung") Then
    13. My.Computer.FileSystem.CreateDirectory(fbd_dir.SelectedPath & "\Manuelle_Sicherung")
    14. End If
    15. pb_start_copy.Visible = True
    16. lbl_start_copy.Visible = True
    17. pb_hourglass.Visible = True
    18. ProgressBar1.Value = ProgressBar1.Minimum
    19. Dim fiSrc = New FileInfo(datapath + "\datenbank.gdb")
    20. ProgressBar1.Maximum = CInt(fiSrc.Length)
    21. ProgressBar1.Visible = True
    22. _Progress = New Progress(Of Integer)(AddressOf ProgressBar1.Increment)
    23. Await Task.Run(Sub() CopyFile(fiSrc, fbd_dir.SelectedPath & "\Manuelle_Sicherung\datenbank.gdb"))
    24. ProgressBar1.Hide()
    25. pb_hourglass.Visible = False
    26. pb_db_copy.Visible = True
    27. lbl_db_copy.Visible = True
    28. lbl_start_services.Visible = True
    29. remove_stop()
    30. start_services()
    31. Await Task.Delay(3000)
    32. check_start()
    33. Timer1.Enabled = True
    34. MessageBox.Show("Datensicherung erfolgreich beendet! Das Programm wird nun beendet!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information)
    35. Application.Exit()
    36. End Sub


    VB.NET-Quellcode

    1. Private _Progress As IProgress(Of Integer)
    2. Private Sub CopyFile(fiSrc As FileInfo, destName As String)
    3. Using src = fiSrc.Open(FileMode.Open), dest = New FileStream(destName, FileMode.Create)
    4. Dim buf(4095) As Byte
    5. Dim read = buf.Length
    6. While read = buf.Length
    7. read = src.Read(buf, 0, read)
    8. _Progress.Report(read)
    9. dest.Write(buf, 0, read)
    10. End While
    11. End Using
    12. End Sub


    Fehler gefunden. Das Value von Progressbar kann keine Int-Werte von 4697300992 (bytes) :D
    Ich habs gerade mit nemm dreisatz versucht, irgendwie bin ich grad zu blöd dazu,...
    ich bekomm es nicht hin das ganze als dreisatz einzubauen.

    4697300992 / 100 = 1%
    oder bin ich jetzt völlig banane?
    Nein! Doch! OHH!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „samson“ ()

    Du willst doch wohl eher wissen, wieviel Prozent erreicht sind, oder?
    Da brauchst Du sowas (aus C# übersetzt, daher keine Garantie, dass es in VB.Net ganz korrekt ist):

    VB.NET-Quellcode

    1. Dim ThreadingLinecount As Integer = 0 'höchster Wert (Anzahl Zeilen einer Datei oder so was halt)
    2. Dim ThreadingCurrentline As Integer = 0 'erreichter Wert
    3. Dim ThreadingHighestPercentageReached As Integer = 0 'Merker des zuletzt ermittelten Prozentwertes um unnötige Invokes zu vermeiden
    4. ' Deine Verabreitungsroutine
    5. Dim percent As Integer = CInt((CSng(ThreadingCurrentline) * 100 / CSng(ThreadingLinecount)))
    6. If percent > ThreadingHighestPercentageReached Then
    7. ThreadingHighestPercentageReached = percent
    8. 'hier dein Invoke
    9. End If

    @Dksksm Danke für den Snippet!
    Ich hab es versucht auf VB.Net anzuwenden und den Code anzupassen, leider ohne Erfolg.

    VB.NET-Quellcode

    1. Private _Progress As IProgress(Of Integer)
    2. Private Sub CopyFile(fiSrc As FileInfo, destName As String)
    3. Using src = fiSrc.Open(FileMode.Open), dest = New FileStream(destName, FileMode.Create)
    4. Dim buf(4095) As Byte
    5. Dim read = buf.Length
    6. While read = buf.Length
    7. read = src.Read(buf, 0, read)
    8. Dim read_percent As Integer = CInt(read * 100 / fiSrc.Length)
    9. lbl_percent.Text = read_percent.ToString
    10. _Progress.Report(read)
    11. dest.Write(buf, 0, read)
    12. End While
    13. End Using
    14. End Sub


    Mein aktueller Code ist obenstehend, leider auch hier, kein Erfolg.
    Ich bekomm es einfach nicht hin, das er mir das als Prozent ausgibt.
    Im Code ist zu sehen das ich es versucht habe, es als Label auszugeben, leider bleibt es hier auf 0 stehen.
    Was mach ich Falsch?
    Wo hab ich den Denkfehler?
    Nein! Doch! OHH!
    Ich habe mir jetzt nicht den ganzen Thread durchgelesen, aber basierend auf deinem letzten Posting würde ich die Methode eher so schreiben:

    VB.NET-Quellcode

    1. Private Sub CopyFile(fiSrc As FileInfo, destName As String)
    2. Using src = fiSrc.Open(FileMode.Open), dest = New FileStream(destName, FileMode.Create)
    3. Dim buf(4095) As Byte
    4. While Not src.Position = src.Length
    5. Dim read = src.Read(buf, 0, buf.Length)
    6. Dim read_percent As Integer = CInt(src.Position * 100 / src.Length)
    7. lbl_percent.Text = read_percent.ToString
    8. '_Progress.Report(read)
    9. dest.Write(buf, 0, read)
    10. End While
    11. End Using
    12. End Sub