既然你会vb就好办多了,这里有一个vb写的,你可以参考,php的最近我没有时间,等有时间写一个大家分享:) Public Function backupDatabase(ByVal strSource As String, ByVal strDes As String) On Error GoTo ErrHandle
Dim Handle_Src, Handle_Dest As Long Dim Buf(255) As Byte Dim lngFileSize, dwRead, dwWrite As Long Dim i As Long Dim ret As Long
Handle_Src = CreateFile(strSource, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0&) If (Handle_Src = INVALID_HANDLE_VALUE) Then MsgBox "获得源文件句柄失败!" Exit Function End If
Handle_Dest = CreateFile(strDes, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0&) If (Handle_Dest = INVALID_HANDLE_VALUE) Then MsgBox "获得目的文件句柄失败" Exit Function End If
lngFileSize = GetFileSize(Handle_Src, lngFileSize) With ProgressBar .Min = 0 .Max = Int(lngFileSize / 255) End With For i = 0 To Int(lngFileSize / 255) ret = ReadFile(Handle_Src, Buf(1), UBound(Buf), dwRead, ByVal 0&) ret = WriteFile(Handle_Dest, Buf(1), dwRead, dwWrite, ByVal 0&) ret = GetLastError() ProgressBar.Value = i Next i CloseHandle Handle_Src CloseHandle Handle_Dest Exit Function ErrHandle: MsgBox "备份失败,请重试!", vbYesNo + vbCritical, "数据备份" End FunctionPrivate Sub cmdCancel_Click() Unload Me End Sub上面的使用sdk(api函数)实现的,本来想用put和get函数,但是由于vb的get函数会自动为被写文件添加18个字节的文件属性方面的附加信息,导致文件不可读。 我想在php里应该用fread和fwrite可以实现,没有试过,我想把文件分割成规定大小的"块"来拷贝,应该和网路的传输速率没有关系,因为直接使用的是源文件和目的文件的大小来决定拷贝的进度的:)
所以用PHP实现不太可能,可以考虑用JS来模拟进度条。大家都是来讨论问题的,分数不重要。
关注,帮楼主顶
(1) ping一下得到速率,存在一个文本里(可能需要一个js)
(2) 用文件大小/速率=时间
(3) 时间分成10个(或者更多)小块
(4) 在时间内一块一块的显示
Public Function backupDatabase(ByVal strSource As String, ByVal strDes As String)
On Error GoTo ErrHandle
Dim Handle_Src, Handle_Dest As Long
Dim Buf(255) As Byte
Dim lngFileSize, dwRead, dwWrite As Long
Dim i As Long
Dim ret As Long
Handle_Src = CreateFile(strSource, GENERIC_READ, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0&)
If (Handle_Src = INVALID_HANDLE_VALUE) Then
MsgBox "获得源文件句柄失败!"
Exit Function
End If
Handle_Dest = CreateFile(strDes, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0&)
If (Handle_Dest = INVALID_HANDLE_VALUE) Then
MsgBox "获得目的文件句柄失败"
Exit Function
End If
lngFileSize = GetFileSize(Handle_Src, lngFileSize)
With ProgressBar
.Min = 0
.Max = Int(lngFileSize / 255)
End With
For i = 0 To Int(lngFileSize / 255)
ret = ReadFile(Handle_Src, Buf(1), UBound(Buf), dwRead, ByVal 0&)
ret = WriteFile(Handle_Dest, Buf(1), dwRead, dwWrite, ByVal 0&)
ret = GetLastError()
ProgressBar.Value = i
Next i
CloseHandle Handle_Src
CloseHandle Handle_Dest
Exit Function
ErrHandle:
MsgBox "备份失败,请重试!", vbYesNo + vbCritical, "数据备份"
End FunctionPrivate Sub cmdCancel_Click()
Unload Me
End Sub上面的使用sdk(api函数)实现的,本来想用put和get函数,但是由于vb的get函数会自动为被写文件添加18个字节的文件属性方面的附加信息,导致文件不可读。
我想在php里应该用fread和fwrite可以实现,没有试过,我想把文件分割成规定大小的"块"来拷贝,应该和网路的传输速率没有关系,因为直接使用的是源文件和目的文件的大小来决定拷贝的进度的:)