本文需要您已经看过上期发布的 VB.Net实现登陆Ftp的方法[乐博网原创]
本文是上文的延续 调用了上文中描述过的功能函数
调用方式:
DownloadFile("abc.rar","d:\abc.rar","Flase") ' 3个参数分别为远程ftp的文件名、保存到本地的完整路径、是否续传
功能函数:
Public Sub DownloadFile(ByVal Str_RemoteFileName As String, _ ByVal Str_LocalFileName As String, _ ByVal Bool_Resume As Boolean) Dim Data_St As Stream Dim output As FileStream Dim LobSocket As Socket Dim offset, npos As Long If (Not Logined()) Then Logined() End If SetBinaryMode(True) If (Str_LocalFileName.Equals("")) Then Str_LocalFileName = Str_RemoteFileName End If
If (Not (File.Exists(Str_LocalFileName))) Then Data_St = File.Create(Str_LocalFileName) Data_St.Close() End If
output = New FileStream(Str_LocalFileName, FileMode.Open) LobSocket = CreateDataSocket() offset = 0
If (Bool_Resume) Then offset = output.Length
If (offset > 0) Then SendCommand("REST " & offset) Str_Reply = ServerReply(True) Int_Reply = Int32.Parse(Str_Reply.Substring(0, 3)) If (Int_Reply <> 350) Then offset = 0 End If End If
If (offset > 0) Then npos = output.Seek(offset, SeekOrigin.Begin) End If End If
SendCommand("RETR " & Str_RemoteFileName) Str_Reply = ServerReply(True) Int_Reply = Int32.Parse(Str_Reply.Substring(0, 3))
If (Not (Int_Reply = 150 Or Int_Reply = 125)) Then MsgBox(Str_Reply.Substring(4)) End If
Do While (True) Array.Clear(Byte_Buffer, 0, Byte_Buffer.Length) Int_Bytes = LobSocket.Receive(Byte_Buffer, Byte_Buffer.Length, 0) output.Write(Byte_Buffer, 0, Int_Bytes)
If (Int_Bytes <= 0) Then Exit Do End If Loop
output.Close() If (LobSocket.Connected) Then LobSocket.Close() End If
Str_Reply = ServerReply(True) Int_Reply = Int32.Parse(Str_Reply.Substring(0, 3)) If (Not (Int_Reply = 226 Or Int_Reply = 250)) Then MsgBox(Str_Reply.Substring(4)) End If
End Sub
Private Function CreateDataSocket() As Socket
Dim index1, index2, len As Int32 Dim partCount, i, port As Int32 Dim ipData, buf, ipAddress As String Dim parts(6) As Int32 Dim ch As Char Dim s As Socket Dim ep As IPEndPoint SendCommand("PASV") Str_Reply = ServerReply(True) Int_Reply = Int32.Parse(Str_Reply.Substring(0, 3)) If (Int_Reply <> 227) Then MsgBox(Str_Reply.Substring(4)) End If index1 = Str_Reply.IndexOf("(") index2 = Str_Reply.IndexOf(")") ipData = Str_Reply.Substring(index1 + 1, index2 - index1 - 1) len = ipData.Length partCount = 0 buf = "" For i = 0 To ((len - 1) And partCount <= 6) ch = Char.Parse(ipData.Substring(i, 1)) If (Char.IsDigit(ch)) Then buf += ch ElseIf (ch <> ",") Then MsgBox(Str_Reply) End If
If ((ch = ",") Or (i + 1 = len)) Then Try parts(partCount) = Int32.Parse(buf) partCount += 1 buf = "" Catch ex As Exception MsgBox(Str_Reply) End Try End If Next ipAddress = parts(0) & "." & parts(1) & "." & parts(2) & "." & parts(3) port = parts(4) * (2 ^ 8) port = port + parts(5) s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) ep = New IPEndPoint(Dns.GetHostEntry(ipAddress).AddressList(0), port) Try s.Connect(ep) Catch ex As Exception
MsgBox("无法连接到远程ftp服务器") End Try Return s
End Function
Public Sub SetBinaryMode(ByVal bMode As Boolean)
If (bMode) Then SendCommand("TYPE I") Else SendCommand("TYPE A") End If Str_Reply = ServerReply(True) Int_Reply = Int32.Parse(Str_Reply.Substring(0, 3)) If (Int_Reply <> 200) Then MsgBox("111" & Str_Reply.Substring(4)) End If End Sub |