读书人

小弟我想作一个大文件拷贝的进度条是

发布时间: 2012-03-25 20:55:16 作者: rapoo

我想作一个大文件拷贝的进度条,是用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

读书人网 >VB Dotnet

热点推荐