Datei Kopieren mit Progressbar!

  • VB.NET
  • .NET (FX) 1.0–2.0

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

    Datei Kopieren mit Progressbar!

    Moin! :)
    Ich habe eine Sub die eine Dateikopieren soll, mit einer Progressbar.
    Wenn die Datei klein ist, geht es.
    Aber sobald die Datei groß ist also ein Long.
    Dann erscheint eine Fehlermeldung!
    Die Fehlermeldung wird bei diesem Code angezeigt:
    pgbDateiProzent.Maximum = SourceFile.Length
    Weil die Progressbar nur ein Integer erfassen kann.
    Kann mir jemand bitte mitteilen, wie man das Problem am schnelsten beheben kann?
    BIG THX

    VB.NET-Quellcode

    1. ' Es gilt hier zu beachten, dass der Maximumwert ein Integer ist und
    2. ' daher die Length-Angabe über dem Bereich des Integer hinaus liegen kann.
    3. ' In so einem Fall müsste man den Maximumwert anders definieren
    4. pgbDateiProzent.Maximum = SourceFile.Length

    Die arithmetische Operation hat einen Überlauf verursacht ;(

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private Sub Copy(ByVal SourceFile As String, ByVal Target As String)
    4. ' Progressbar anpassen
    5. pgbDateiProzent.Value = 0
    6. ' Es gilt hier zu beachten, dass der Maximumwert ein Integer ist und
    7. ' daher die Length-Angabe über dem Bereich des Integer hinaus liegen kann.
    8. ' In so einem Fall müsste man den Maximumwert anders definieren
    9. pgbDateiProzent.Maximum = SourceFile.Length
    10. ' Quelle
    11. Dim fsmsource As FileStream = Nothing
    12. ' Zieldatei
    13. Dim fsmtarget As FileStream = Nothing
    14. Try
    15. ' Größe des bei jedem Durchlauf einzulesenden Datenpaketes
    16. Dim buffersize As Int32 = 1024 * 30 ' (30 KByte)
    17. ' Enthält nacher die in buffersize angegeben Menge an
    18. ' eingelesenen Daten
    19. Dim buffer(buffersize) As Byte
    20. ' Ermittelt die tatsächliche eingelesene Menge an Daten
    21. ' im Bytearray readbyte
    22. Dim readbyte As Int32
    23. ' Quelldatei
    24. fsmsource = New FileStream(SourceFile.FullName, FileMode.Open,
    25. FileAccess.Read, FileShare.Read)
    26. ' Zieldatei
    27. fsmtarget = New FileStream(Target + "\" + SourceFile.Name,
    28. FileMode.OpenOrCreate, FileAccess.Write)
    29. ' Aktuele Datei anzeigen
    30. Me.lblDateiAktuelStatus.Text = SourceFile.Name
    31. ' Daten nach und nach einlesen und im Zielstream wieder zurückschreiben
    32. While fsmsource.Position < fsmsource.Length
    33. ' Quelle einlesen
    34. readbyte = fsmsource.Read(buffer, 0, buffersize)
    35. ' In das Ziel schreiben
    36. fsmtarget.Write(buffer, 0, readbyte)
    37. ' Value Eigenschaft der Progressbar anpassen, das Label gibt
    38. ' den prozentualen Fortschritt an
    39. With pgbDateiProzent
    40. .Value += readbyte
    41. lblDateiProzent.Text = CStr(CInt(100 * .Value / .Maximum)) + "%"
    42. End With
    43. ' Reporten
    44. Application.DoEvents()
    45. End While
    46. ' Streams schließen
    47. fsmsource.Close()
    48. fsmtarget.Close()
    49. Catch ex As Exception
    50. MsgBox(ex.Message)
    51. End Try
    52. End Sub
    53. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    54. Copy("F:\Temp\Auto.jpg", Me.txtZielverzeichnis.Text)
    55. End Sub
    56. End Class
    Visual Basic.NET 8o
    MS-SQL
    8o
    @Cheffboss Dann mach die ProgressBar nicht an der Dateilänge fest, sondern am Anteil der kopierten Datei, also Prozent.
    Dreisatz und feddich.
    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!
    Man könnte ja auch das Kopieren Asynchron laufen lassen und von dort regelmäßig eine Event auslösen welches die GUI aktualisiert. In Kombination mit dem, was die beiden Vorposter geschrieben haben.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich habe das Problem nun lösen können. :thumbsup:
    Vielen Dank, für eure Hilfreiche Unterstützung.

    Folgende Schritte waren notwendig!
    edit:
    @ThuCommix
    Vielen Dank!
    Fehler gefixt! :thumbup:

    VB.NET-Quellcode

    1. Dim bereitsvorhaden, ingesamt As Long
    2. Public Function Percent(ByVal CurrVal As Long, ByVal MaxVal As Long) As Integer
    3. Return Int(CurrVal / MaxVal * 100 )
    4. End Function
    5. ' Progressbar anpassen...
    6. pgbDateiProzent.Maximum = 100
    7. pgbDateiProzent.Minimum = 0
    8. pgbDateiProzent.Value = 0
    9. ingesamt = SourceFile.Length
    10. ' Berechnen...
    11. bereitsvorhaden += readbyte
    12. With pgbDateiProzent
    13. .Value = Percent(bereitsvorhaden, ingesamt)
    14. End With
    15. bereitsvorhaden = Nothing

    Visual Basic.NET 8o
    MS-SQL
    8o

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

    @ThuCommix Wegen Math.Round(...)
    @Cheffboss Machst Du einfach Return (CurrVal * 100 ) \ MaxVal (erst Multiplikation, dann Integer-Division).
    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!