我建议你使用 Task 和 CancellationTokenSource,而不是搞乱计时器,它会给你更好的文件控制和行为- 复制操作。
我在一个名为 FileCopy 的简单类中实现了所有这些,该类用于演示示例。
如果您不喜欢它,您可以获取源代码并根据您的需要对其进行调整,或者只是看看如何管理我的源代码中的内容以自己制作!。
一个例子:
Imports Elektro.IO.Types
Public Class Form1 : Inherits Form
Friend WithEvents FileCopier As FileCopy
Private fileCopyCancelToken As CancellationTokenSource
Private Sub ButtonStart_Click() Handles Button1.Click
Me.FileCopier = New FileCopy("C:\Source File.ext")
' It returns a CancellationTokenSource to cancel the task whenever you want.
Me.fileCopyCancelToken = Me.FileCopier.CopyTo("C:\Target file.ext",
overwrite:=True,
deleteFileOnCancel:=True,
cancelCallback:=Nothing)
End Sub
Private Sub ButtonCancel_Click() Handles Button2.Click
Me.fileCopyCancelToken.Cancel()
End Sub
Private Sub FileCopier_ProgressChanged(ByVal sender As Object, ByVal e As FileCopyProgressChangedEventArgs) _
Handles FileCopier.FileCopyProgressChanged
Console.WriteLine(String.Format("Copied: {0:0.00}%", e.Percentage))
End Sub
End Class
这个其他(更扩展的)示例可以在源代码中找到:
Public Class Form1 : Inherits Form
Friend WithEvents FileCopier As FileCopy
Private fileCopyCancelToken As CancellationTokenSource
Private Sub Button1_Click() Handles Button1.Click
Me.StartCopy()
End Sub
Private Sub Button2_Click() Handles Button2.Click
Me.CancelCopy()
End Sub
Private Sub StartCopy()
' Create a dummy file of 2 GB
Using fs As New FileStream("C:\source file.ext", FileMode.CreateNew)
fs.SetLength(2147483648)
End Using
Me.FileCopier = New FileCopy("C:\source file.ext")
Me.fileCopyCancelToken =
Me.FileCopier.CopyTo("C:\Target file.ext",
bufferSize:=(CInt(Me.FileCopier.File.Length \ (1024 * 100)) + 1),
overwrite:=True,
deleteFileOnCancel:=False,
cancelCallback:=AddressOf Me.FileCopier_CancelCallBack)
End Sub
Private Sub CancelCopy()
' Cancel the current file-copy operation.
Me.FileCopier.CancelCopy(Me.fileCopyCancelToken)
End Sub
''' <summary>
''' Callback that is called when the a file-copy operaton of the <see cref="FileCopier"/> is cancelled.
''' </summary>
Private Sub FileCopier_CancelCallBack()
Me.Invoke(
Sub()
Me.Label1.Text = "Canceled!"
Me.Label2.Text = "Canceled!"
Me.Label3.Text = "Canceled!"
Me.Label4.Text = "Canceled!"
End Sub)
End Sub
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Handles the <see cref="FileCopy.FileCopyProgressChanged"/> event of the <see cref="FileCopier"/> instance.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <param name="sender">
''' The source of the event.
''' </param>
'''
''' <param name="e">
''' The <see cref="FileCopyProgressChangedEventArgs"/> instance containing the event data.
''' </param>
''' ----------------------------------------------------------------------------------------------------
Private Sub FileCopier_FileCopyProgressChanged(ByVal sender As Object, ByVal e As FileCopyProgressChangedEventArgs) _
Handles FileCopier.FileCopyProgressChanged
Me.Invoke(
Sub()
Me.Label1.Text = String.Format("Size: {0} MB", (e.Filesize / 1024).ToString("n2"))
Me.Label2.Text = String.Format("Written: {0} MB", (e.BytesRead / 1024).ToString("n2"))
Me.Label3.Text = String.Format("Read: {0} MB", (e.BytesRemaining / 1024).ToString("n2"))
Me.Label4.Text = String.Format("Done: {0}%", e.Percentage.ToString("n2"))
End Sub)
End Sub
End Class
希望对你有帮助。