Bei Async Copy Progressbar anzeigen

  • VB.NET

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

    Bei Async Copy Progressbar anzeigen

    Moin Moin zusammen,

    ich bin mal wieder am verzweifeln.
    Ich habe meine CopyAnweisung Async und die funktioniert auch.
    Die Datei (es ist immer ein und die selbe) die ich kopiere, soll der Fortschritt mit Progressbar angezeigt werden.
    Leider scheitere ich aktuell an den einfachsten sachen.

    Hier mein Code:

    Die Datenbankgröße ermittel ich bereits im Form.Load()

    VB.NET-Quellcode

    1. dbsize = Math.Round(CDbl(My.Computer.FileSystem.GetFileInfo(datapath + "\datenbank.gdb").Length / 1024 ^ 3), 2).ToString
    2. lbl_dbsize.Text = "Datenbankgröße: " & dbsize & " GB"



    Kopieranweisung:

    VB.NET-Quellcode

    1. Private Function FileCopy(ByVal file_source As String, ByVal file_destination As String) As String
    2. Try
    3. File.Copy(file_source, file_destination, True)
    4. Return "Datenbank kopiert"
    5. Catch ex As Exception
    6. End Try
    7. End Function


    Button-Event

    VB.NET-Quellcode

    1. Private Async Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_dasi.Click
    2. If My.Computer.FileSystem.DirectoryExists(cb_target.SelectedValue.ToString & "\Manuelle_Sicherung") Then
    3. TextBox1.AppendText(" Kopiervorgang gestartet" & Environment.NewLine)
    4. Dim return_copy As String = Await Task.Run(Function() FileCopy(datapath + "\MOSTAT184.gdb", lbl_status.Text & "\Manuelle_Sicherung\sicherung.gdb"))
    5. TextBox1.AppendText(return_copy & Environment.NewLine)
    6. Else
    7. My.Computer.FileSystem.CreateDirectory(cb_target.SelectedValue.ToString & "Manuelle_Sicherung")
    8. TextBox1.AppendText(" Kopiervorgang gestartet" & Environment.NewLine)
    9. Dim return_copy As String = Await Task.Run(Function() FileCopy(datapath + "\MOSTAT184.gdb", lbl_status.Text & "\Manuelle_Sicherung\sicherung.gdb"))
    10. TextBox1.AppendText(return_copy & Environment.NewLine)
    11. End If
    12. End Sub


    Wie bekomme ich da nun die Progressbar rein?
    Ich habe verschiedene wege versucht, leider immer gescheitert und google findet mir nur alte Codefetzen die nicht mehr funktionieren.

    Wie immer, Danke für Eure Hilfe!
    Stefan
    Nein! Doch! OHH!

    samson schrieb:

    Wie bekomme ich da nun die Progressbar rein?
    Du musst in einem Thread portionsweise kopieren und nach jeder Portion ein entsprechendes Event an die GUI senden.
    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!
    @samson Fang an und schmeiß den VB6-Ranz raus.
    Entferne den VisualBasic-Verweis:

    und mach da ein VB.NET-Programm draus.
    Gib der Funktion FileCopy den Return-Typ Boolean
    und mach aus File.Copy() den Portionierer.
    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!
    @samson Schreibe eine Schleife über die Dateilänge, lies mit einem BinaryReader 1000 Bytes oder so aus der Quelldatei, schreib diese Bytes in die Zieldatei, sende ein Event, lies die nächsten 1000 Bytes usw. bis die Datei übertragen ist.
    Das dauert natürlich etwas länger als das schnöde File.Copy().
    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!

    samson schrieb:

    Diese dürfte hinterher Korrupt sein.
    Nein.
    Es ist eine Datei wie jede andere auch, und andere Programme kopieren auch portionsweise.
    Oder wird die Datei während des Kopierens beschrieben?
    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!
    Stimmt, daran hab ich garnicht gedacht... Die Dienste werden vorher beendet...
    ! Sorry !
    Ich hab nebenher nochmal google befragt, leider keinen Ansatz gefunden mit dem Byteweise kopieren und das in einer Schleife...
    Kann mir das vielleicht jemand auf "deutsch" Schrittweise erklären?
    Nein! Doch! OHH!
    @ErfinderDesRades Danke für den Link und das gute Tutorial mit dem Streams.
    Klingt alles soweit einleuchtend, nur bekomme ich es nicht hin, das ganze Async laufen zu lassen mit Progressbar.
    Kannst du mir da vielleicht nochmal einen Tritt geben?

    Ich hab mir für das ganze ein Bastelprojekt erstellt um das ich es erstmal alleinstehend sehen kann wie es denn dann funktionieren soll...
    Hier mal der Code aus deinem Beispiel mit meinen Änderungen.
    Daran kannst du mir bestimmt leichter erklären wo ich falsch liege.

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Threading.Tasks
    3. Public Class Form1
    4. Dim source As String = "C:\4gbdatei.zip"
    5. Dim destination As String = "C:\Temp\4gbdatei.zip"
    6. Dim dbsize As Integer
    7. Dim dbsize_byte As Integer
    8. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. dbsize_byte = CInt(My.Computer.FileSystem.GetFileInfo(source).Length.ToString)
    10. dbsize = CInt(Math.Round(CDbl(My.Computer.FileSystem.GetFileInfo(source).Length / 1024 ^ 3), 2).ToString)
    11. Label1.Text = CType(dbsize, String)
    12. End Sub
    13. Private Sub CopyFile(srcName As String, destName As String)
    14. Using src = New FileStream(srcName, FileMode.Open), dest = New FileStream(destName, FileMode.Create)
    15. Dim buf(4095) As Byte
    16. Dim read = buf.Length
    17. While read = buf.Length
    18. read = src.Read(buf, 0, read)
    19. dest.Write(buf, 0, read)
    20. End While
    21. End Using
    22. End Sub
    23. Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    24. Dim return_copy As String = Await Task.Run(Function() CopyFile(source, destination))
    25. TextBox1.AppendText(return_copy & Environment.NewLine)
    26. End Sub
    27. End Class


    Zudem erhalte ich momentan bei der "CopyFile Funktion" den Fehler: "Der Ausdruck ergibt keinen Wert."
    Nein! Doch! OHH!

    samson schrieb:

    "Der Ausdruck ergibt keinen Wert."
    In welcher Zeile Deines Programmes?
    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!
    @samson Klar.

    VB.NET-Quellcode

    1. Await Task.Run(Sub() CopyFile(source, destination))
    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!
    @RodFromGermany oh man... da hät ich lange suchen können... hab aus dem "Private Sub" eine "Private Function" gemacht... Nun geht es.
    Nun such ich noch den passenden Bereich wo ich dann den "3 Satz" und die Progressbar füttern kann...

    hab es nun schon divers versucht, leider wohl immernoch der falsche Ansatz.
    Hier nochmal der aktuelle Code

    Diesen Code nutze ich nicht mehr!
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function CopyFile(srcName As String, destName As String)
    2. Using src = New FileStream(srcName, IO.FileMode.Open), dest = New FileStream(destName, IO.FileMode.Create)
    3. Dim len As Long = src.Length - 1
    4. Dim buf(4095) As Byte
    5. Dim read = buf.Length
    6. While read = buf.Length
    7. read = src.Read(buf, 0, read)
    8. dest.Write(buf, 0, read)
    9. Return CInt(src.Position / len * 100)
    10. End While
    11. End Using
    12. End Function
    13. Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    14. Dim return_copy As String = Await Task.Run(Function() CopyFile(source, destination))
    15. ProgressBar1.Value = return_copy
    16. End Sub

    Nein! Doch! OHH!

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