小弟我想作一个大文件拷贝的进度条,是用ProgressBar来作的,有几个小问题想问一下

我想作一个大文件拷贝的进度条,是用ProgressBar来作的,有几个问题想问一下
用线程和计时器来定时的查看当前目的路径的文件已经复制了多少,然后和源文件比较得出百分比,然后再来控制进度条的进度,
可是现在有个问题,我是用System.IO.FileInfo.Length来得到目的文件的大小,可是发现不算是在复制的什么阶段,文件大小就是全部文件的大小,我想知道用什么方面可以得到当前正在复制的目的文件的真实大小,目的文件的大小应该是越来越大,真到和源文件一样大才对啊

------解决方案--------------------
VB.NET code
Public Class Form1 
  Public Const PROGRESS_CONTINUE As Integer = 0
  Public Const PROGRESS_CANCEL As Integer = 1
  Public Const PROGRESS_STOP As Integer = 2
  Public Const PROGRESS_QUIET As Integer = 3

  'CopyFileEx callback routine state change values
  Public Const CALLBACK_CHUNK_FINISHED As Integer = &H0S
  Public Const CALLBACK_STREAM_SWITCH As Integer = &H1S

  'CopyFileEx option flags
  Public Const COPY_FILE_FAIL_IF_EXISTS As Integer = &H1S
  Public Const COPY_FILE_RESTARTABLE As Integer = &H2S
  Public Const COPY_FILE_OPEN_SOURCE_FOR_WRITE As Integer = &H4S

  Public Declare Auto Function CopyFileEx Lib "kernel32" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal lpProgressRoutine As CopyProgressEvent, ByVal lpData As Long, ByVal ByValpbCancel As Boolean, ByVal dwCopyFlags As Integer) As Integer
  Public Delegate Function CopyProgressEvent(ByVal TotalFileSize As Long, ByVal TotalBytesTransferred As Long, ByVal StreamSize As Long, ByVal StreamBytesTransferred As Long, ByVal dwStreamNumber As Integer, ByVal dwCallbackReason As Integer, ByVal hSourceFile As Integer, ByVal hDestinationFile As Integer, ByRef lpData As Integer) As Integer
  Public Function CopyProgress(ByVal TotalFileSize As Long, ByVal TotalBytesTransferred As Long, ByVal StreamSize As Long, ByVal StreamBytesTransferred As Long, ByVal dwStreamNumber As Integer, ByVal dwCallbackReason As Integer, ByVal hSourceFile As Integer, ByVal hDestinationFile As Integer, ByRef lpData As Integer) As Integer

    Select Case dwCallbackReason
      Case CALLBACK_STREAM_SWITCH

        Me.ProgressBar1.Value = 0
        Me.ProgressBar1.Minimum = 0
        Me.ProgressBar1.Maximum = (TotalFileSize)
        CopyProgress = PROGRESS_CONTINUE

      Case CALLBACK_CHUNK_FINISHED
        '// 显示进度
        Try
          Me.ProgressBar1.Value = (TotalBytesTransferred)
        Catch ex As Exception
          MessageBox.Show(ex.Message)
        End Try

        System.Windows.Forms.Application.DoEvents()
        CopyProgress = PROGRESS_CONTINUE

    End Select
    CopyProgress = PROGRESS_CONTINUE

  End Function


  Public Function MyCopyFile(ByVal strFrom As String, ByVal strTo As String) As Boolean

    Dim lngReturn As Long

    lngReturn = CopyFileEx(strFrom, strTo, AddressOf CopyProgress, 0, False, COPY_FILE_RESTARTABLE)

    If lngReturn = 0 Then
      MyCopyFile = False
    Else
      MyCopyFile = True
    End If
  End Function

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    MyCopyFile("c:\1.exe", "d:\1.exe")
    MessageBox.Show("拷贝完毕")
  End Sub
End Class