Private Function ProcessRETRCommand(strFileName As String, lStartPoint As Long) As Boolean
'該函數的命令是向伺服器發送retr命令,讓伺服器給客戶傳送一份在路徑名中指定的文件的副本
Dim strResponse As String
Dim strData As String
On Error GoTo ProcessRETRCommand_Err_Handler
m_strDataBuffer = "" wscControl.SendData "RETR " & strFileName & vbCrLf
Debug.Print "RETR " & strFileName
RaiseEvent ReplyMessage("RETR " & strFileName & vbCrLf)
m_objTimeOut.StartTimer
AllBytes = 0
Do
DoEvents
'
If m_objTimeOut.Timeout Then
m_LastError = ERROR_FTP_USER_TIMEOUT
Exit Do
End If
'
If Not m_bTransferInProgress Then
strData = m_strWinsockBuffer
Exit Do
End If
'
If InStr(1, m_strWinsockBuffer, vbCrLf) > 0 Then
If GetResponseCode(m_strWinsockBuffer) = 150 Or _
GetResponseCode(m_strWinsockBuffer) = 125 Then
' If lStartPoint = 0 And FileExists(m_strLocalFilePath) Then
' Kill m_strLocalFilePath
' End If
'如果文件沒有打開,則打開文件
If Not m_bFileIsOpened Then
m_intLocalFileID = FreeFile
If m_bFileIsOpened Then
Open m_strLocalFilePath For Binary As m_intLocalFileID
End If
If lStartPoint > 0 Then
Seek m_intLocalFileID, lStartPoint + 1
End If
m_bFileIsOpened = True
m_lDownloadedBytes = 0
End If
m_strWinsockBuffer = Mid$(m_strWinsockBuffer, InStr(1, m_strWinsockBuffer, vbCrLf) + 2)
RaiseEvent StateChanged(FTP_TRANSFER_STARTING)
Else
strData = m_strWinsockBuffer
m_strWinsockBuffer = ""
Exit Do
End If
End If
Loop
m_objTimeOut.StopTimer
If GetResponseCode(strData) = FTP_RESPONSE_CLOSING_DATA_CONNECTION Or _
GetResponseCode(strData) = FTP_RESPONSE_REQUESTED_FILE_ACTION_OK_COMPLETED Then
ProcessRETRCommand = True
Else
ProcessFtpResponse GetResponseCode(strData)
ProcessRETRCommand = False
End If
Debug.Print GetResponseCode(strData)
Exit_Label:
Exit FunctionProcessRETRCommand_Err_Handler:
If Not ProcessWinsockError(Err.Number, Err.Description) Then
Err.Raise vbObjectError + 1000 + Err.Number, "CFtpConnection.ProcessRETRCommand", Err.Description
End If
GoTo Exit_Label
End FunctionPrivate Function ProcessRESTCommand(lStartPoint As Long) As Boolean
'該函數的的功能是向伺服器發送rest命令,表示將從lstartpoint點開始傳輸文件
Dim strResponse As String
Dim strData As String
On Error GoTo ProcessRESTCommand_Err_Handler
wscControl.SendData "REST " & lStartPoint & vbCrLf
Debug.Print "REST " & lStartPoint
RaiseEvent ReplyMessage("REST " & lStartPoint & vbCrLf)
m_objTimeOut.StartTimer
Do
DoEvents
'
If m_objTimeOut.Timeout Then
m_LastError = ERROR_FTP_USER_TIMEOUT
Exit Do
End If
'
If InStr(1, m_strWinsockBuffer, vbCrLf) > 0 Then
strData = m_strWinsockBuffer
m_strWinsockBuffer = ""
Exit Do
End If
Loop
m_objTimeOut.StopTimer If GetResponseCode(strData) = FTP_RESPONSE_REQUESTED_FILE_ACTION_PENDING_FURTHER_INFO Then
ProcessRESTCommand = True
Else
ProcessFtpResponse GetResponseCode(strData)
End If
Exit_Label:
Exit FunctionProcessRESTCommand_Err_Handler:
If Not ProcessWinsockError(Err.Number, Err.Description) Then
Err.Raise vbObjectError + 1000 + Err.Number, "CFtpConnection.ProcessRESTCommand", Err.Description
End If
GoTo Exit_Label
End Function就是這個函數惹得禍,各位看看錯在哪裏/
'該函數的命令是向伺服器發送retr命令,讓伺服器給客戶傳送一份在路徑名中指定的文件的副本
Dim strResponse As String
Dim strData As String
On Error GoTo ProcessRETRCommand_Err_Handler
m_strDataBuffer = "" wscControl.SendData "RETR " & strFileName & vbCrLf
Debug.Print "RETR " & strFileName
RaiseEvent ReplyMessage("RETR " & strFileName & vbCrLf)
m_objTimeOut.StartTimer
AllBytes = 0
Do
DoEvents
'
If m_objTimeOut.Timeout Then
m_LastError = ERROR_FTP_USER_TIMEOUT
Exit Do
End If
'
If Not m_bTransferInProgress Then
strData = m_strWinsockBuffer
Exit Do
End If
'
If InStr(1, m_strWinsockBuffer, vbCrLf) > 0 Then
If GetResponseCode(m_strWinsockBuffer) = 150 Or _
GetResponseCode(m_strWinsockBuffer) = 125 Then
' If lStartPoint = 0 And FileExists(m_strLocalFilePath) Then
' Kill m_strLocalFilePath
' End If
'如果文件沒有打開,則打開文件
If Not m_bFileIsOpened Then
m_intLocalFileID = FreeFile
If m_bFileIsOpened Then
Open m_strLocalFilePath For Binary As m_intLocalFileID
End If
If lStartPoint > 0 Then
Seek m_intLocalFileID, lStartPoint + 1
End If
m_bFileIsOpened = True
m_lDownloadedBytes = 0
End If
m_strWinsockBuffer = Mid$(m_strWinsockBuffer, InStr(1, m_strWinsockBuffer, vbCrLf) + 2)
RaiseEvent StateChanged(FTP_TRANSFER_STARTING)
Else
strData = m_strWinsockBuffer
m_strWinsockBuffer = ""
Exit Do
End If
End If
Loop
m_objTimeOut.StopTimer
If GetResponseCode(strData) = FTP_RESPONSE_CLOSING_DATA_CONNECTION Or _
GetResponseCode(strData) = FTP_RESPONSE_REQUESTED_FILE_ACTION_OK_COMPLETED Then
ProcessRETRCommand = True
Else
ProcessFtpResponse GetResponseCode(strData)
ProcessRETRCommand = False
End If
Debug.Print GetResponseCode(strData)
Exit_Label:
Exit FunctionProcessRETRCommand_Err_Handler:
If Not ProcessWinsockError(Err.Number, Err.Description) Then
Err.Raise vbObjectError + 1000 + Err.Number, "CFtpConnection.ProcessRETRCommand", Err.Description
End If
GoTo Exit_Label
End FunctionPrivate Function ProcessRESTCommand(lStartPoint As Long) As Boolean
'該函數的的功能是向伺服器發送rest命令,表示將從lstartpoint點開始傳輸文件
Dim strResponse As String
Dim strData As String
On Error GoTo ProcessRESTCommand_Err_Handler
wscControl.SendData "REST " & lStartPoint & vbCrLf
Debug.Print "REST " & lStartPoint
RaiseEvent ReplyMessage("REST " & lStartPoint & vbCrLf)
m_objTimeOut.StartTimer
Do
DoEvents
'
If m_objTimeOut.Timeout Then
m_LastError = ERROR_FTP_USER_TIMEOUT
Exit Do
End If
'
If InStr(1, m_strWinsockBuffer, vbCrLf) > 0 Then
strData = m_strWinsockBuffer
m_strWinsockBuffer = ""
Exit Do
End If
Loop
m_objTimeOut.StopTimer If GetResponseCode(strData) = FTP_RESPONSE_REQUESTED_FILE_ACTION_PENDING_FURTHER_INFO Then
ProcessRESTCommand = True
Else
ProcessFtpResponse GetResponseCode(strData)
End If
Exit_Label:
Exit FunctionProcessRESTCommand_Err_Handler:
If Not ProcessWinsockError(Err.Number, Err.Description) Then
Err.Raise vbObjectError + 1000 + Err.Number, "CFtpConnection.ProcessRESTCommand", Err.Description
End If
GoTo Exit_Label
End Function就是這個函數惹得禍,各位看看錯在哪裏/
超快速的多文件传送源码,在本地局域网上可达到1.8Mb+的速度
http://www.21code.com/codebase/?pos=down&id=1920不是很好下,建议凌晨人少的时候多刷新试几次