VB.Net实现Ftp下载的方法 - NetPig

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