SetBinaryMode(True) If (sLocalFileName.Equals(""))
Then sLocalFileName = sFileName End If If (Not
(File.Exists(sLocalFileName))) Then st =
File.Create(sLocalFileName) st.Close() End If
If (Not (m_iRetValue = 125 Or
m_iRetValue = 150)) Then MessageString = m_sReply Throw New
IOException(m_sReply.Substring(4)) End
If
‘在上载之前,检查文件是否存在。 bFileNotFound = False If
(File.Exists(sFileName)) Then ‘打开输入流读取源文件 input = New
FileStream(sFileName, FileMode.Open) If (offset <> 0)
Then input.Seek(offset, SeekOrigin.Begin) End
If
‘上载这个文件
m_iBytes = input.Read(m_aBuffer, 0,
m_aBuffer.Length) Do While (m_iBytes >
0) cSocket.Send(m_aBuffer, m_iBytes, 0) m_iBytes =
input.Read(m_aBuffer, 0,
m_aBuffer.Length) Loop input.Close() Else bFileNotFound =
True End If
If (cSocket.Connected)
Then cSocket.Close() End If
‘如果找不到文件,检查返回值
If
(bFileNotFound) Then MessageString = m_sReply Throw New
IOException("The file: “& sFileName & " was not found. " &
_ "Cannot upload the file to the FTP site") End
If
ReadReply()
If (Not (m_iRetValue = 226 Or m_iRetValue =
250)) Then MessageString = m_sReply Throw New
IOException(m_sReply.Substring(4)) End If End
Sub
‘从远程FTP服务器上删除一个文件。
Public Function DeleteFile(ByVal
sFileName As String) As Boolean Dim bResult As Boolean
bResult
= True If (Not (m_bLoggedIn)) Then Login() End
If ‘发送一个FTP命令,删除一个文件。 SendCommand("DELE " & sFileName) If
(m_iRetValue <> 250) Then bResult = False MessageString =
m_sReply End If
‘返回最终结果
Return bResult End
Function
‘在远程FTP服务器上重命名一个文件
Public Function RenameFile(ByVal
sOldFileName As String, _ ByVal sNewFileName As String) As
Boolean
Dim bResult As Boolean bResult = True If (Not
(m_bLoggedIn)) Then Login() End
If ‘发送一个FTP命令,对一个文件重命名 SendCommand("RNFR " &
sOldFileName) If (m_iRetValue <> 350) Then MessageString =
m_sReply Throw New IOException(m_sReply.Substring(4)) End
If
‘发送一个FTP命令,对一个文件更改为新名称 ‘如果新的文件名存在,会被覆盖。 SendCommand("RNTO
" & sNewFileName) If (m_iRetValue <> 250)
Then MessageString = m_sReply Throw New
IOException(m_sReply.Substring(4)) End If ‘返回最终结果 Return
bResult End Function
‘这是一个在远程服务器上创建目录的函数 Public Function
CreateDirectory(ByVal sDirName As String) As Boolean Dim bResult As
Boolean
bResult = True If (Not (m_bLoggedIn))
Then Login() End
If ‘发送一个FTP命令,在FTP服务器上制作一个目录 SendCommand("MKD " &
sDirName) If (m_iRetValue <> 257) Then bResult =
False MessageString = m_sReply End If
‘返回最终结果 Return
bResult End Function
‘这是一个在远程FTP服务器上删除目录的函数
Public
Function RemoveDirectory(ByVal sDirName As String) As Boolean
Dim
bResult As Boolean bResult = True ‘检查是否已登录FTP服务器 If (Not
(m_bLoggedIn)) Then Login() End
If ‘发送一个FTP命令,删除在FTP服务器上的目录 SendCommand("RMD " &
sDirName) If (m_iRetValue <> 250) Then bResult =
False MessageString = m_sReply End If
‘返回最终结果 Return
bResult End Function
‘这是一个用来在远程FTP服务器上改变当前工作目录的函数。
Public
Function ChangeDirectory(ByVal sDirName As String) As Boolean Dim
bResult As Boolean
bResult = True ‘检查你是否在根目录 If
(sDirName.Equals(".")) Then Exit Function End
If ‘检查是否已登录FTP服务器 If (Not (m_bLoggedIn)) Then Login() End
If ‘发送FTP命令,改变在FTP服务器上的目录。 SendCommand("CWD " &
sDirName) If (m_iRetValue <> 250) Then bResult =
False MessageString = m_sReply End If
Me.m_sRemotePath =
sDirName
‘返回最终结果 Return bResult End
Function
‘关闭远程服务器的FTP链接
Public Sub CloseConnection() If
(Not (m_objClientSocket Is Nothing))
Then ‘发送一个FTP命令,结束FTP服务系统。 SendCommand("QUIT") End
If
Cleanup() End Sub
#End Region
#Region "Private
Subs and Functions"
‘从FTP服务器得到回应。
Private Sub
ReadReply() m_sMes = "" m_sReply = ReadLine() m_iRetValue =
Int32.Parse(m_sReply.Substring(0, 3)) End
Sub
‘清除一些变量
Private Sub Cleanup() If Not
(m_objClientSocket Is Nothing)
Then m_objClientSocket.Close() m_objClientSocket =
Nothing End If
m_bLoggedIn = False End
Sub
‘从FTP服务器读取一行。
Private Function ReadLine(Optional ByVal
bClearMes As Boolean = False) As String Dim seperator As Char =
ControlChars.Lf Dim mess() As String
If (bClearMes)
Then m_sMes = "" End If Do While
(True) m_aBuffer.Clear(m_aBuffer, 0, BLOCK_SIZE) m_iBytes =
m_objClientSocket.Receive(m_aBuffer, m_aBuffer.Length, 0) m_sMes +=
ASCII.GetString(m_aBuffer, 0, m_iBytes) If (m_iBytes <
m_aBuffer.Length) Then Exit Do End If Loop
mess =
m_sMes.Split(seperator) If (m_sMes.Length > 2) Then m_sMes =
mess(mess.Length - 2) Else m_sMes = mess(0) End If
If
(Not (m_sMes.Substring(3, 1).Equals(" "))) Then Return
ReadLine(True) End If
Return m_sMes End
Function
‘这是一个你想链接的FTP服务器用于发送命令的函数。
Private Sub
SendCommand(ByVal sCommand As String) sCommand = sCommand &
ControlChars.CrLf Dim cmdbytes As Byte() =
ASCII.GetBytes(sCommand) m_objClientSocket.Send(cmdbytes,
cmdbytes.Length, 0) ReadReply() 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 ‘发送一个FTP命令,用于被动数据链接
SendCommand("PASV") If
(m_iRetValue <> 227) Then MessageString = m_sReply Throw New
IOException(m_sReply.Substring(4)) End If
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 MessageString = m_sReply Throw New IOException("Malformed
PASV reply: " & m_sReply) End If
If ((ch = ",") Or (i + 1 =
len)) Then Try parts(partCount) = Int32.Parse(buf) partCount +=
1 buf = "" Catch ex As Exception MessageString =
m_sReply Throw New IOException("Malformed PASV reply: " &
m_sReply) End