Daten Kopieren - Kommt nie an

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Bluespide.

    Daten Kopieren - Kommt nie an

    Hi,
    habe im Internet ein Code gefunden, wie man mit Multithreading. Bei grossen dateien reagiert's nicht mehr und bei kleinen sachen kommt die datei nie an...
    Hier der Code:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.ComponentModel
    3. Public Class Form1
    4. Private th As BackgroundWorker
    5. ' wieviele Bytes wurden kopiert
    6. Private lngBytesCopied As Long
    7. ' Die Speicheradresse der Zieldatei
    8. Private lngSourceFileLength As Long
    9. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    10. If th.IsBusy Then
    11. th.CancelAsync()
    12. End If
    13. End Sub
    14. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    15. th = New BackgroundWorker
    16. AddHandler th.DoWork, AddressOf th_DoWork
    17. AddHandler th.RunWorkerCompleted, AddressOf th_Completed
    18. AddHandler th.ProgressChanged, AddressOf th_ProgressChanged
    19. th.WorkerReportsProgress = True
    20. th.WorkerSupportsCancellation = True
    21. Me.lblSource.Text = ""
    22. Me.lblTarget.Text = ""
    23. Me.cmdCopyAsync.Enabled = False
    24. Me.cmdCancel.Enabled = False
    25. Me.progress.Visible = False
    26. Me.progress.Visible = False
    27. End Sub
    28. Private Sub cmdSelectSource_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSelectSource.Click
    29. Dim openDlg As New OpenFileDialog
    30. With openDlg
    31. .Title = "Select file"
    32. .InitialDirectory = Application.StartupPath
    33. If .ShowDialog = Windows.Forms.DialogResult.OK Then
    34. Me.lblSource.Text = .FileName
    35. End If
    36. End With
    37. End Sub
    38. Private Sub cmdSelectTarget_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSelectTarget.Click
    39. Dim fldBrowser As New FolderBrowserDialog
    40. With fldBrowser
    41. .ShowNewFolderButton = True
    42. If .ShowDialog = Windows.Forms.DialogResult.OK Then
    43. Me.lblTarget.Text = .SelectedPath
    44. Me.cmdCopyAsync.Enabled = True
    45. End If
    46. End With
    47. End Sub
    48. Private Sub cmdCopyAsync_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCopyAsync.Click
    49. If Me.lblTarget.Text.Length > 0 And Me.lblSource.Text.Length > 0 Then
    50. Me.cmdCopyAsync.Enabled = False
    51. Me.progress.Minimum = 0
    52. Me.progress.Maximum = 100
    53. Me.progress.Visible = True
    54. Me.progress.Visible = True
    55. Me.cmdCancel.Enabled = True
    56. ' Start des Threads löst dann die th_DoWork Prozedur aus
    57. th.RunWorkerAsync()
    58. End If
    59. End Sub
    60. Private Sub th_Completed(ByVal sender As Object, _
    61. ByVal e As RunWorkerCompletedEventArgs)
    62. Dim strFinished As String = String.Empty
    63. If e.Cancelled Then
    64. strFinished = "Operation Cancelled"
    65. ElseIf e.Error IsNot Nothing Then
    66. strFinished = "Operation Error " & e.Error.Message
    67. Else
    68. strFinished = "Operation Sucessfull"
    69. End If
    70. MessageBox.Show("CopyThread finished" & vbCrLf & strFinished)
    71. Me.cmdCopyAsync.Enabled = True
    72. End Sub
    73. Private Sub cmdCancel_Click(ByVal sender As System.Object, _
    74. ByVal e As System.EventArgs) Handles cmdCancel.Click
    75. If th.IsBusy Then
    76. th.CancelAsync()
    77. End If
    78. End Sub
    79. Private Sub th_ProgressChanged(ByVal sender As Object, _
    80. ByVal e As ProgressChangedEventArgs)
    81. Try
    82. Me.lblProgress.Text = lngBytesCopied.ToString & " Bytes From " & _
    83. lngSourceFileLength.ToString & " Copied"
    84. Me.progress.Value = e.ProgressPercentage.ToString
    85. Catch ex As Exception
    86. MessageBox.Show(ex.Message)
    87. End Try
    88. End Sub
    89. Private Sub th_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
    90. Dim fi As New FileInfo(Me.lblSource.Text)
    91. Dim inStream As FileStream = Nothing
    92. Dim outStream As FileStream = Nothing
    93. Dim buffer(2048) As Byte
    94. Dim offset As Integer = 0
    95. Try
    96. inStream = New FileStream(fi.FullName, FileMode.Open)
    97. outStream = New FileStream(Me.lblTarget.Text & "" & fi.Name, FileMode.Create)
    98. lngSourceFileLength = inStream.Length
    99. Do
    100. If th.CancellationPending = True Then
    101. e.Cancel = True
    102. inStream.Close()
    103. outStream.Close()
    104. Exit Sub
    105. End If
    106. offset = inStream.Read(buffer, 0, buffer.Length)
    107. outStream.Write(buffer, 0, offset)
    108. lngBytesCopied += offset
    109. ' WICHTIG: Hier könen wir einen Progress darstellen
    110. th.ReportProgress(offset / inStream.Length * 100)
    111. Loop Until offset = 0
    112. Catch ex As Exception
    113. MessageBox.Show(ex.Message)
    114. Finally
    115. inStream.Close()
    116. outStream.Close()
    117. End Try
    118. End Sub
    119. End Class


    Wo ist der Fehler? Es kommt nirgends eine Fehlermeldung