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