<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.vbex.ru/index.php?action=history&amp;feed=atom&amp;title=VB.Net_Tutorial%2FSocket_Network%2FFTP_server</id>
		<title>VB.Net Tutorial/Socket Network/FTP server - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.vbex.ru/index.php?action=history&amp;feed=atom&amp;title=VB.Net_Tutorial%2FSocket_Network%2FFTP_server"/>
		<link rel="alternate" type="text/html" href="http://www.vbex.ru/index.php?title=VB.Net_Tutorial/Socket_Network/FTP_server&amp;action=history"/>
		<updated>2026-04-05T05:38:54Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.vbex.ru/index.php?title=VB.Net_Tutorial/Socket_Network/FTP_server&amp;diff=3518&amp;oldid=prev</id>
		<title> в 16:40, 26 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.vbex.ru/index.php?title=VB.Net_Tutorial/Socket_Network/FTP_server&amp;diff=3518&amp;oldid=prev"/>
				<updated>2010-05-26T16:40:30Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 16:40, 26 мая 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
			</entry>

	<entry>
		<id>http://www.vbex.ru/index.php?title=VB.Net_Tutorial/Socket_Network/FTP_server&amp;diff=3519&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.vbex.ru/index.php?title=VB.Net_Tutorial/Socket_Network/FTP_server&amp;diff=3519&amp;oldid=prev"/>
				<updated>2010-05-26T12:55:52Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==FTP server==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;vbnet&amp;quot;&amp;gt;&amp;quot;Visual Basic.Net JingCai Programming 100 Examples&lt;br /&gt;
&amp;quot;Author: Yong Zhang&lt;br /&gt;
&amp;quot;Publisher: Water Publisher China&lt;br /&gt;
&amp;quot;ISBN: 750841156&lt;br /&gt;
Imports System.Net&lt;br /&gt;
Imports System.Net.Sockets&lt;br /&gt;
Imports System.Threading&lt;br /&gt;
Imports System.IO&lt;br /&gt;
Imports System.Text&lt;br /&gt;
Imports System.Collections&lt;br /&gt;
Public Class FTPServer&lt;br /&gt;
  Public Shared Sub Main()&lt;br /&gt;
    Dim tcpListener As System.Net.Sockets.TcpListener&lt;br /&gt;
    Try&lt;br /&gt;
      Dim hostName As String = Dns.GetHostName()&lt;br /&gt;
      Dim serverIP As IPAddress = Dns.Resolve(hostName).AddressList(0)&lt;br /&gt;
      &amp;quot; FTP Server Port = 21&lt;br /&gt;
      Dim Port As String = &amp;quot;21&amp;quot;&lt;br /&gt;
      Dim serverHost As New IPEndPoint(serverIP, Int32.Parse(Port))&lt;br /&gt;
      tcpListener = New TcpListener(serverIP, Int32.Parse(Port))&lt;br /&gt;
      tcpListener.Start()&lt;br /&gt;
      Console.WriteLine(&amp;quot;FTP Server started at: &amp;quot; + serverIP.ToString() + &amp;quot;:&amp;quot; + Port)&lt;br /&gt;
      Dim FTPSession As New FTPSession(tcpListener)&lt;br /&gt;
      Dim serverThread As New Thread(New ThreadStart(AddressOf FTPSession.ProcessThread))&lt;br /&gt;
      serverThread.Start()&lt;br /&gt;
    Catch ex As Exception&lt;br /&gt;
      Console.WriteLine(ex.StackTrace.ToString())&lt;br /&gt;
    End Try&lt;br /&gt;
  End Sub&lt;br /&gt;
End Class&lt;br /&gt;
Public Class FTPSession&lt;br /&gt;
  &amp;quot; Server Socket&lt;br /&gt;
  Private tcpListener As System.Net.Sockets.TcpListener&lt;br /&gt;
  &amp;quot; Connection Socket&lt;br /&gt;
  Private clientSocket As System.Net.Sockets.Socket&lt;br /&gt;
  &amp;quot; Data Socket&lt;br /&gt;
  Private dataSocket As System.Net.Sockets.Socket&lt;br /&gt;
  &amp;quot; FTP Root Path&lt;br /&gt;
  Private rootPath As String = Directory.GetCurrentDirectory() &amp;amp; &amp;quot;\FTPRoot\&amp;quot;&lt;br /&gt;
  Private currentPath As String = rootPath&lt;br /&gt;
  Private currentPathStr As String = &amp;quot;/&amp;quot;&lt;br /&gt;
  Private loginName As String = Nothing&lt;br /&gt;
  Private blnBinary As Boolean&lt;br /&gt;
  &amp;quot; Data Socket IP and Port&lt;br /&gt;
  Private clientIP As String = Nothing&lt;br /&gt;
  &amp;quot;Private ipString As String = Nothing&lt;br /&gt;
  Private dataPort As Integer&lt;br /&gt;
  Public Sub New(ByVal tcpListener As System.Net.Sockets.TcpListener)&lt;br /&gt;
    Me.tcpListener = tcpListener&lt;br /&gt;
  End Sub&lt;br /&gt;
  Public Sub resetDefault()&lt;br /&gt;
    currentPath = rootPath&lt;br /&gt;
    currentPathStr = &amp;quot;/&amp;quot;&lt;br /&gt;
    Console.WriteLine(&amp;quot;currentPath: &amp;quot; &amp;amp; currentPath)&lt;br /&gt;
  End Sub&lt;br /&gt;
  Public Sub showMessage(ByVal Msg As String)&lt;br /&gt;
    Dim CurThread As Thread&lt;br /&gt;
    CurThread = System.Threading.Thread.CurrentThread()&lt;br /&gt;
    Dim sendByte() As Byte = Encoding.Default.GetBytes(Msg &amp;amp; ControlChars.CrLf)&lt;br /&gt;
    SyncLock CurThread&lt;br /&gt;
      clientSocket.Send(sendByte, 0, sendByte.Length, SocketFlags.None)&lt;br /&gt;
      Console.WriteLine(Msg)&lt;br /&gt;
    End SyncLock&lt;br /&gt;
  End Sub&lt;br /&gt;
  Public Sub showData(ByVal Msg As String)&lt;br /&gt;
    Dim dataIP As IPAddress = Dns.Resolve(clientIP).AddressList(0)&lt;br /&gt;
    Dim dataHost As New IPEndPoint(dataIP, Int32.Parse(dataPort))&lt;br /&gt;
    Dim CurThread As Thread&lt;br /&gt;
    Try&lt;br /&gt;
      CurThread = System.Threading.Thread.CurrentThread()&lt;br /&gt;
      Dim sendByte() As Byte = Encoding.Default.GetBytes(Msg)&lt;br /&gt;
      &amp;quot;  Establish data connection&lt;br /&gt;
      dataSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)&lt;br /&gt;
      dataSocket.Connect(dataHost)&lt;br /&gt;
      SyncLock CurThread&lt;br /&gt;
        dataSocket.Send(sendByte, 0, sendByte.Length, SocketFlags.None)&lt;br /&gt;
        Console.WriteLine(Msg)&lt;br /&gt;
        dataSocket.Close()&lt;br /&gt;
      End SyncLock&lt;br /&gt;
    Catch ex As Exception&lt;br /&gt;
      Console.WriteLine(ex.StackTrace.ToString())&lt;br /&gt;
      dataSocket.Close()&lt;br /&gt;
    End Try&lt;br /&gt;
  End Sub&lt;br /&gt;
  Public Sub ProcessThread()&lt;br /&gt;
    While (True)&lt;br /&gt;
      Try&lt;br /&gt;
        clientSocket = tcpListener.AcceptSocket()&lt;br /&gt;
        &amp;quot; Socket Information&lt;br /&gt;
        Dim clientInfo As IPEndPoint = CType(clientSocket.RemoteEndPoint, IPEndPoint)&lt;br /&gt;
        Console.WriteLine(&amp;quot;Client: &amp;quot; + clientInfo.Address.ToString() + &amp;quot;:&amp;quot; + clientInfo.Port.ToString())&lt;br /&gt;
        &amp;quot; Set Thread for each FTP client Connection&lt;br /&gt;
        Dim clientThread As New Thread(New ThreadStart(AddressOf ProcessRequest))&lt;br /&gt;
        clientThread.Start()&lt;br /&gt;
      Catch ex As Exception&lt;br /&gt;
        Console.WriteLine(ex.StackTrace.ToString())&lt;br /&gt;
        If clientSocket.Connected Then&lt;br /&gt;
          clientSocket.Close()&lt;br /&gt;
        End If&lt;br /&gt;
      End Try&lt;br /&gt;
    End While&lt;br /&gt;
  End Sub&lt;br /&gt;
  Protected Sub ProcessRequest()&lt;br /&gt;
    Dim recvBytes(128) As Byte&lt;br /&gt;
    Dim htmlReq As String = Nothing&lt;br /&gt;
    Dim bytes As Int32&lt;br /&gt;
    Dim ftpCmd As String = Nothing&lt;br /&gt;
    Dim strDate As String = DateTime.Now.ToShortDateString() &amp;amp; &amp;quot; &amp;quot; &amp;amp; DateTime.Now.ToLongTimeString()&lt;br /&gt;
    Dim strMsg As String&lt;br /&gt;
    strMsg = &amp;quot;220 .NET FTP Server (Version 1.0.0) &amp;quot; &amp;amp; strDate &amp;amp; ControlChars.CrLf &amp;amp; _&lt;br /&gt;
       &amp;quot;220 Welcome to .NET FTP Server&amp;quot;&lt;br /&gt;
    showMessage(strMsg)&lt;br /&gt;
    ftpCmd = &amp;quot;&amp;quot;&lt;br /&gt;
    &amp;quot; if FTP command is not &amp;quot;QUIT&amp;quot;&lt;br /&gt;
    While Not (ftpCmd.ToLower.StartsWith(&amp;quot;quit&amp;quot;))&lt;br /&gt;
      Try&lt;br /&gt;
        bytes = clientSocket.Receive(recvBytes)&lt;br /&gt;
        ftpCmd = Encoding.ASCII.GetString(recvBytes, 0, bytes)&lt;br /&gt;
        Console.WriteLine(&amp;quot;FTP Command: &amp;quot; &amp;amp; ftpCmd)&lt;br /&gt;
        ftpCommand(ftpCmd)&lt;br /&gt;
      Catch ex As Exception&lt;br /&gt;
        Console.WriteLine(&amp;quot;Exception: &amp;quot; &amp;amp; ex.StackTrace.ToString())&lt;br /&gt;
        ftpCmd = &amp;quot;quit&amp;quot;&lt;br /&gt;
      End Try&lt;br /&gt;
    End While&lt;br /&gt;
    &amp;quot; Close FTP Session&lt;br /&gt;
    Try&lt;br /&gt;
      If clientSocket.Connected Then&lt;br /&gt;
        clientSocket.Close()&lt;br /&gt;
      End If&lt;br /&gt;
    Catch ex As Exception&lt;br /&gt;
      Console.WriteLine(ex.StackTrace.ToString())&lt;br /&gt;
    End Try&lt;br /&gt;
  End Sub&lt;br /&gt;
  Private Sub ftpCommand(ByVal cmd As String)&lt;br /&gt;
    Dim ftpCmdtok() As String&lt;br /&gt;
    Dim strRequest As String&lt;br /&gt;
    Dim ftpCmd As String = Nothing&lt;br /&gt;
    Dim strArg As String&lt;br /&gt;
    &amp;quot;Dim strFromName As String&lt;br /&gt;
    &amp;quot;Dim strToName As String&lt;br /&gt;
    If (cmd = Nothing) Then cmd = &amp;quot;&amp;quot;&lt;br /&gt;
    ftpCmdtok = cmd.Trim.Split(&amp;quot; &amp;quot;)&lt;br /&gt;
    ftpCmd = ftpCmdtok(0).ToLower.Trim&lt;br /&gt;
    &amp;quot; user: Login&lt;br /&gt;
    If (ftpCmd.Equals(&amp;quot;user&amp;quot;)) Then&lt;br /&gt;
      Try&lt;br /&gt;
        loginName = ftpCmdtok(1).Trim&lt;br /&gt;
        If (loginName.ToLower.Trim = &amp;quot;anonymous&amp;quot;) Then&lt;br /&gt;
          showMessage(&amp;quot;331 Anonymous access allowed, send identity (e-mail name) as password.&amp;quot;)&lt;br /&gt;
        Else&lt;br /&gt;
          showMessage(&amp;quot;331 Password required for &amp;quot; &amp;amp; loginName &amp;amp; &amp;quot;.&amp;quot;)&lt;br /&gt;
        End If&lt;br /&gt;
      Catch&lt;br /&gt;
        showMessage(&amp;quot;500 User syntax.&amp;quot;)&lt;br /&gt;
      End Try&lt;br /&gt;
      &amp;quot; pass: Verify password&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;pass&amp;quot;)) Then&lt;br /&gt;
      &amp;quot; Add the logic of verifying password here&lt;br /&gt;
      showMessage(&amp;quot;230 &amp;quot; &amp;amp; loginName &amp;amp; &amp;quot; user logged in.&amp;quot;)&lt;br /&gt;
      resetDefault()&lt;br /&gt;
      &amp;quot; quit&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;quit&amp;quot;)) Then&lt;br /&gt;
      showMessage(&amp;quot;221 Service closing control connection. Goodbye.&amp;quot;)&lt;br /&gt;
      resetDefault()&lt;br /&gt;
      &amp;quot; port&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;port&amp;quot;)) Then&lt;br /&gt;
      Dim strPort() As String&lt;br /&gt;
      Try&lt;br /&gt;
        &amp;quot; PORT h1,h2,h3,h4,p1,p2&lt;br /&gt;
        strPort = ftpCmdtok(1).Trim.Split(&amp;quot;,&amp;quot;)&lt;br /&gt;
        &amp;quot; h1&lt;br /&gt;
        clientIP = strPort(0) &amp;amp; &amp;quot;.&amp;quot; &amp;amp; strPort(1) &amp;amp; &amp;quot;.&amp;quot; &amp;amp; strPort(2) &amp;amp; &amp;quot;.&amp;quot; &amp;amp; strPort(3)&lt;br /&gt;
        &amp;quot; Port = p1 * 256 + p2&lt;br /&gt;
        dataPort = Int32.Parse(strPort(4)) * 256 + Int32.Parse(strPort(5))&lt;br /&gt;
        &amp;quot; Demo only &lt;br /&gt;
        showMessage(&amp;quot;PORT &amp;quot; &amp;amp; ftpCmdtok(1).Trim &amp;amp; &amp;quot;.&amp;quot;)&lt;br /&gt;
        showMessage(&amp;quot;200 PORT command successful.&amp;quot;)&lt;br /&gt;
      Catch&lt;br /&gt;
        showMessage(&amp;quot;500 PORT number syntax.&amp;quot;)&lt;br /&gt;
      End Try&lt;br /&gt;
      &amp;quot; list: List Directory (dir)&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;list&amp;quot;)) Then&lt;br /&gt;
      If (UBound(ftpCmdtok) &amp;gt;= 1) Then&lt;br /&gt;
        strArg = ftpCmdtok(1).Trim&lt;br /&gt;
      Else&lt;br /&gt;
        strArg = &amp;quot;&amp;quot;&lt;br /&gt;
      End If&lt;br /&gt;
      listDirectory(strArg, True)&lt;br /&gt;
      &amp;quot; NLST: Name List (ls)&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;nlst&amp;quot;)) Then&lt;br /&gt;
      If (UBound(ftpCmdtok) &amp;gt;= 1) Then&lt;br /&gt;
        strArg = ftpCmdtok(1).Trim&lt;br /&gt;
      Else&lt;br /&gt;
        strArg = &amp;quot;&amp;quot;&lt;br /&gt;
      End If&lt;br /&gt;
      listDirectory(strArg, False)&lt;br /&gt;
      &amp;quot; cdup: Change to Parent Directory&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;cdup&amp;quot;)) Then&lt;br /&gt;
      changeDirectory(&amp;quot;.&amp;quot;)&lt;br /&gt;
      &amp;quot; cwd: Change Directory (cd)&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;cwd&amp;quot;)) Then&lt;br /&gt;
      strArg = ftpCmdtok(1).Trim&lt;br /&gt;
      changeDirectory(strArg)&lt;br /&gt;
      &amp;quot; xpwd: Current Directory (pwd)&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;xpwd&amp;quot;)) Then&lt;br /&gt;
      showMessage(&amp;quot;257 &amp;quot;&amp;quot;&amp;quot; &amp;amp; currentPathStr &amp;amp; &amp;quot;&amp;quot;&amp;quot; is current directory.&amp;quot;)&lt;br /&gt;
      Console.WriteLine(&amp;quot;Physical Path: &amp;quot; &amp;amp; currentPath)&lt;br /&gt;
      &amp;quot; xmkd: Make Directory (mkdir)&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;xmkd&amp;quot;)) Then&lt;br /&gt;
      strArg = ftpCmdtok(1).Trim&lt;br /&gt;
      makeDirectory(strArg)&lt;br /&gt;
      &amp;quot; xrmd: Remove Directory (rmdir)&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;xrmd&amp;quot;)) Then&lt;br /&gt;
      strArg = ftpCmdtok(1).Trim&lt;br /&gt;
      removeDirectory(strArg)&lt;br /&gt;
      &amp;quot; dele: Remove File (delete)&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;dele&amp;quot;)) Then&lt;br /&gt;
      strArg = ftpCmdtok(1).Trim&lt;br /&gt;
      removeFile(strArg)&lt;br /&gt;
      &amp;quot; noop: No Operation&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;noop&amp;quot;)) Then&lt;br /&gt;
      showMessage(&amp;quot;200 OK.&amp;quot;)&lt;br /&gt;
      &amp;quot; syst&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;syst&amp;quot;)) Then&lt;br /&gt;
      showMessage(&amp;quot;215 .NET FTP Server.&amp;quot;)&lt;br /&gt;
      &amp;quot;  help: Remote Help (remotehelp)&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;help&amp;quot;)) Then&lt;br /&gt;
      Dim strHelp As String&lt;br /&gt;
      strHelp = &amp;quot;214-The following commands are recognized(* ==&amp;gt;&amp;quot;s unimplemented).... &amp;quot; &amp;amp; ControlChars.CrLf &amp;amp; _&lt;br /&gt;
                &amp;quot;214 HELP command successful.&amp;quot;&lt;br /&gt;
      showMessage(strHelp)&lt;br /&gt;
      &amp;quot; type&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;type&amp;quot;)) Then&lt;br /&gt;
      Try&lt;br /&gt;
        strArg = ftpCmdtok(1).Trim&lt;br /&gt;
        &amp;quot; Binary&lt;br /&gt;
        If (strArg.ToLower.IndexOf(&amp;quot;i&amp;quot;) &amp;lt;&amp;gt; -1) Then&lt;br /&gt;
          blnBinary = True&lt;br /&gt;
          showMessage(&amp;quot;200 TYPE set to I.&amp;quot;)&lt;br /&gt;
          &amp;quot; ASCII&lt;br /&gt;
        ElseIf (strArg.ToLower.IndexOf(&amp;quot;a&amp;quot;) &amp;lt;&amp;gt; -1) Then&lt;br /&gt;
          blnBinary = False&lt;br /&gt;
          showMessage(&amp;quot;200 TYPE set to A.&amp;quot;)&lt;br /&gt;
        Else&lt;br /&gt;
          showMessage(&amp;quot;500 TYPE &amp;quot; &amp;amp; strArg &amp;amp; &amp;quot; syntax.&amp;quot;)&lt;br /&gt;
        End If&lt;br /&gt;
      Catch&lt;br /&gt;
        showMessage(&amp;quot;500 TYPE syntax.&amp;quot;)&lt;br /&gt;
      End Try&lt;br /&gt;
      &amp;quot; mode&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;mode&amp;quot;)) Then&lt;br /&gt;
      Try&lt;br /&gt;
        strArg = ftpCmdtok(1).Trim&lt;br /&gt;
        If (strArg.ToLower.Equals(&amp;quot;s&amp;quot;)) Then&lt;br /&gt;
          showMessage(&amp;quot;200 MODE S.&amp;quot;)&lt;br /&gt;
        Else&lt;br /&gt;
          showMessage(&amp;quot;500 MODE &amp;quot; &amp;amp; strArg &amp;amp; &amp;quot; syntax.&amp;quot;)&lt;br /&gt;
        End If&lt;br /&gt;
      Catch&lt;br /&gt;
        showMessage(&amp;quot;500 MODE syntax.&amp;quot;)&lt;br /&gt;
      End Try&lt;br /&gt;
      &amp;quot; stru&lt;br /&gt;
    ElseIf (ftpCmd.Equals(&amp;quot;stru&amp;quot;)) Then&lt;br /&gt;
      Try&lt;br /&gt;
        strArg = ftpCmdtok(1).Trim&lt;br /&gt;
        If (strArg.ToLower.Equals(&amp;quot;f&amp;quot;)) Then&lt;br /&gt;
          showMessage(&amp;quot;200 STRU F.&amp;quot;)&lt;br /&gt;
        Else&lt;br /&gt;
          showMessage(&amp;quot;501 STRU &amp;quot; &amp;amp; strArg &amp;amp; &amp;quot; not found.&amp;quot;)&lt;br /&gt;
        End If&lt;br /&gt;
      Catch&lt;br /&gt;
        showMessage(&amp;quot;500 STRU syntax.&amp;quot;)&lt;br /&gt;
      End Try&lt;br /&gt;
    Else&lt;br /&gt;
      showMessage(&amp;quot;502 &amp;quot; + ftpCmd + &amp;quot; not implemented. Invalid command.&amp;quot;)&lt;br /&gt;
    End If&lt;br /&gt;
  End Sub&lt;br /&gt;
  &amp;quot; Change Directory&lt;br /&gt;
  Private Sub changeDirectory(ByVal ftpPath As String)&lt;br /&gt;
    &amp;quot;Dim dirInfo As DirectoryInfo = New DirectoryInfo(ftpPath)&lt;br /&gt;
    Dim strPath As String = &amp;quot;&amp;quot;&lt;br /&gt;
    Try&lt;br /&gt;
      If (ftpPath = &amp;quot;.&amp;quot;) Then&lt;br /&gt;
        strPath = rootPath&lt;br /&gt;
      ElseIf (ftpPath.StartsWith(&amp;quot;..&amp;quot;)) Then&lt;br /&gt;
        If (currentPath = rootPath) Then&lt;br /&gt;
          strPath = rootPath&lt;br /&gt;
        Else&lt;br /&gt;
          If (currentPath.EndsWith(&amp;quot;\&amp;quot;)) Then&lt;br /&gt;
            strPath = currentPath.Substring(0, currentPath.Length - 1)&lt;br /&gt;
            strPath = strPath.Substring(0, strPath.LastIndexOf(&amp;quot;\&amp;quot;) + 1)&lt;br /&gt;
          Else&lt;br /&gt;
            strPath = currentPath.Substring(0, currentPath.LastIndexOf(&amp;quot;\&amp;quot;) + 1)&lt;br /&gt;
          End If&lt;br /&gt;
        End If&lt;br /&gt;
      ElseIf (ftpPath.StartsWith(&amp;quot;\&amp;quot;)) Then&lt;br /&gt;
        strPath = currentPath &amp;amp; ftpPath.Substring(1, ftpPath.Length)&lt;br /&gt;
      Else&lt;br /&gt;
        strPath = currentPath &amp;amp; ftpPath&lt;br /&gt;
      End If&lt;br /&gt;
      If Not strPath.EndsWith(&amp;quot;\&amp;quot;) Then&lt;br /&gt;
        strPath = strPath &amp;amp; &amp;quot;\&amp;quot;&lt;br /&gt;
      End If&lt;br /&gt;
      &amp;quot; File&lt;br /&gt;
      If Path.GetFileName(strPath) &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then&lt;br /&gt;
        showMessage(&amp;quot;550 &amp;quot; &amp;amp; ftpPath &amp;amp; &amp;quot; is not a directory.&amp;quot;)&lt;br /&gt;
        Exit Sub&lt;br /&gt;
      End If&lt;br /&gt;
      Dim dirInfo As DirectoryInfo = New DirectoryInfo(strPath)&lt;br /&gt;
      &amp;quot; Path is Read-Only&lt;br /&gt;
      If dirInfo.Attributes = FileAttributes.ReadOnly Then&lt;br /&gt;
        showMessage(&amp;quot;550 &amp;quot; &amp;amp; ftpPath &amp;amp; &amp;quot;: Access is denied.&amp;quot;)&lt;br /&gt;
        Exit Sub&lt;br /&gt;
      End If&lt;br /&gt;
      If Directory.Exists(strPath) Then&lt;br /&gt;
        &amp;quot; Change Directory&lt;br /&gt;
        Directory.SetCurrentDirectory(strPath)&lt;br /&gt;
        currentPath = strPath&lt;br /&gt;
        If (currentPath = rootPath) Then&lt;br /&gt;
          currentPathStr = &amp;quot;/&amp;quot;&lt;br /&gt;
        Else&lt;br /&gt;
          currentPathStr = &amp;quot;/&amp;quot; &amp;amp; currentPath.Replace(rootPath, &amp;quot;&amp;quot;)&lt;br /&gt;
        End If&lt;br /&gt;
        currentPathStr = currentPathStr.Replace(&amp;quot;\&amp;quot;, &amp;quot;/&amp;quot;)&lt;br /&gt;
        If currentPathStr.EndsWith(&amp;quot;/&amp;quot;) And currentPathStr.Length &amp;gt; 1 Then&lt;br /&gt;
          currentPathStr = currentPathStr.Substring(0, currentPathStr.Length - 1)&lt;br /&gt;
        End If&lt;br /&gt;
        showMessage(&amp;quot;250 CWD command successful. &amp;quot; &amp;amp; currentPathStr)&lt;br /&gt;
      Else&lt;br /&gt;
        showMessage(&amp;quot;550 &amp;quot; &amp;amp; ftpPath &amp;amp; &amp;quot; is not a subdirectory of &amp;quot; &amp;amp; currentPathStr &amp;amp; &amp;quot;.&amp;quot;)&lt;br /&gt;
      End If&lt;br /&gt;
    Catch ex As Exception&lt;br /&gt;
      showMessage(&amp;quot;500 &amp;quot; &amp;amp; ex.StackTrace.ToString)&lt;br /&gt;
    End Try&lt;br /&gt;
  End Sub&lt;br /&gt;
  &amp;quot; Create a new directory&lt;br /&gt;
  Private Sub makeDirectory(ByVal ftpPath As String)&lt;br /&gt;
    Dim strPath As String = &amp;quot;&amp;quot;&lt;br /&gt;
    Try&lt;br /&gt;
      If (ftpPath.StartsWith(&amp;quot;\&amp;quot;)) Then&lt;br /&gt;
        ftpPath = ftpPath.Substring(1, ftpPath.Length)&lt;br /&gt;
      End If&lt;br /&gt;
      strPath = currentPath &amp;amp; ftpPath&lt;br /&gt;
      If Not strPath.EndsWith(&amp;quot;\&amp;quot;) Then&lt;br /&gt;
        strPath = strPath &amp;amp; &amp;quot;\&amp;quot;&lt;br /&gt;
      End If&lt;br /&gt;
      Console.WriteLine(&amp;quot;New Path: &amp;quot; &amp;amp; strPath)&lt;br /&gt;
      Dim dirInfo As DirectoryInfo = New DirectoryInfo(currentPath)&lt;br /&gt;
      &amp;quot; Path is Read-Only&lt;br /&gt;
      If dirInfo.Attributes = FileAttributes.ReadOnly Then&lt;br /&gt;
        showMessage(&amp;quot;550 &amp;quot; &amp;amp; ftpPath &amp;amp; &amp;quot;: Access is denied.&amp;quot;)&lt;br /&gt;
        Exit Sub&lt;br /&gt;
      End If&lt;br /&gt;
      &amp;quot; Directory Exists&lt;br /&gt;
      If Directory.Exists(strPath) Then&lt;br /&gt;
        showMessage(&amp;quot;550 &amp;quot; &amp;amp; ftpPath &amp;amp; &amp;quot;: Cannot create a file/path when that file/path already exists.&amp;quot;)&lt;br /&gt;
      Else&lt;br /&gt;
        Directory.CreateDirectory(strPath)&lt;br /&gt;
        showMessage(&amp;quot;257 &amp;quot;&amp;quot;&amp;quot; &amp;amp; ftpPath &amp;amp; &amp;quot;&amp;quot;&amp;quot; directory created.&amp;quot;)&lt;br /&gt;
      End If&lt;br /&gt;
    Catch ex As Exception&lt;br /&gt;
      showMessage(&amp;quot;500 &amp;quot; &amp;amp; ex.StackTrace.ToString)&lt;br /&gt;
    End Try&lt;br /&gt;
  End Sub&lt;br /&gt;
  &amp;quot; Delete a existing directory&lt;br /&gt;
  Private Sub removeDirectory(ByVal ftpPath As String)&lt;br /&gt;
    Dim strPath As String = &amp;quot;&amp;quot;&lt;br /&gt;
    Try&lt;br /&gt;
      If (ftpPath.StartsWith(&amp;quot;\&amp;quot;)) Then&lt;br /&gt;
        ftpPath = ftpPath.Substring(1, ftpPath.Length)&lt;br /&gt;
      End If&lt;br /&gt;
      strPath = currentPath &amp;amp; ftpPath&lt;br /&gt;
      If Not strPath.EndsWith(&amp;quot;\&amp;quot;) Then&lt;br /&gt;
        strPath = strPath &amp;amp; &amp;quot;\&amp;quot;&lt;br /&gt;
      End If&lt;br /&gt;
      Console.WriteLine(&amp;quot;Delete Path: &amp;quot; &amp;amp; strPath)&lt;br /&gt;
      If Directory.Exists(strPath) Then&lt;br /&gt;
        Dim dirInfo As DirectoryInfo = New DirectoryInfo(currentPath)&lt;br /&gt;
        &amp;quot; Path is Read-Only&lt;br /&gt;
        If dirInfo.Attributes = FileAttributes.ReadOnly Then&lt;br /&gt;
          showMessage(&amp;quot;550 &amp;quot; &amp;amp; ftpPath &amp;amp; &amp;quot;: Access is denied.&amp;quot;)&lt;br /&gt;
          Exit Sub&lt;br /&gt;
        End If&lt;br /&gt;
        Dim fileEntries(), dirEntries() As String&lt;br /&gt;
        fileEntries = Directory.GetFiles(strPath)&lt;br /&gt;
        dirEntries = Directory.GetDirectories(strPath)&lt;br /&gt;
        &amp;quot; Directory is empty&lt;br /&gt;
        If fileEntries.Length = 0 And dirEntries.Length = 0 Then&lt;br /&gt;
          &amp;quot; Delete Directory &lt;br /&gt;
          Directory.Delete(strPath)&lt;br /&gt;
          showMessage(&amp;quot;250 RMD command successful.&amp;quot;)&lt;br /&gt;
        Else&lt;br /&gt;
          showMessage(&amp;quot;550 &amp;quot; &amp;amp; ftpPath &amp;amp; &amp;quot;: The directory is not empty.&amp;quot;)&lt;br /&gt;
        End If&lt;br /&gt;
      Else&lt;br /&gt;
        showMessage(&amp;quot;550 &amp;quot; &amp;amp; ftpPath &amp;amp; &amp;quot; is not existed.&amp;quot;)&lt;br /&gt;
      End If&lt;br /&gt;
    Catch ex As Exception&lt;br /&gt;
      showMessage(&amp;quot;500 &amp;quot; &amp;amp; ex.StackTrace.ToString)&lt;br /&gt;
    End Try&lt;br /&gt;
  End Sub&lt;br /&gt;
  &amp;quot; Delete a existing file&lt;br /&gt;
  Private Sub removeFile(ByVal ftpFile As String)&lt;br /&gt;
    Dim strFile As String = &amp;quot;&amp;quot;&lt;br /&gt;
    Try&lt;br /&gt;
      If (ftpFile.StartsWith(&amp;quot;\&amp;quot;)) Then&lt;br /&gt;
        ftpFile = ftpFile.Substring(1, ftpFile.Length)&lt;br /&gt;
      End If&lt;br /&gt;
      strFile = currentPath &amp;amp; ftpFile&lt;br /&gt;
      Console.WriteLine(&amp;quot;Delete File: &amp;quot; &amp;amp; strFile)&lt;br /&gt;
      If File.Exists(strFile) Then&lt;br /&gt;
        Dim fileInfo As FileInfo = New FileInfo(strFile)&lt;br /&gt;
        &amp;quot; File is Read-Only&lt;br /&gt;
        If fileInfo.Attributes = FileAttributes.ReadOnly Then&lt;br /&gt;
          showMessage(&amp;quot;550 &amp;quot; &amp;amp; ftpFile &amp;amp; &amp;quot;: Access is denied.&amp;quot;)&lt;br /&gt;
        Else&lt;br /&gt;
          &amp;quot; Delete File &lt;br /&gt;
          File.Delete(strFile)&lt;br /&gt;
          showMessage(&amp;quot;250 DELE command successful.&amp;quot;)&lt;br /&gt;
        End If&lt;br /&gt;
      Else&lt;br /&gt;
        showMessage(&amp;quot;550 &amp;quot; &amp;amp; ftpFile &amp;amp; &amp;quot;: The system cannot find the file specified.&amp;quot;)&lt;br /&gt;
      End If&lt;br /&gt;
    Catch ex As Exception&lt;br /&gt;
      showMessage(&amp;quot;500 &amp;quot; &amp;amp; ex.StackTrace.ToString)&lt;br /&gt;
    End Try&lt;br /&gt;
  End Sub&lt;br /&gt;
  &amp;quot; ls / list / nlst&lt;br /&gt;
  Private Sub listDirectory(ByVal strList As String, ByVal showDetail As Boolean)&lt;br /&gt;
    Dim strPath As String = &amp;quot;&amp;quot;&lt;br /&gt;
    Dim strBuff As String = &amp;quot;&amp;quot;&lt;br /&gt;
    If strList = &amp;quot;&amp;quot; Then&lt;br /&gt;
      strPath = currentPath&lt;br /&gt;
    Else&lt;br /&gt;
      strPath = currentPath &amp;amp; strList&lt;br /&gt;
    End If&lt;br /&gt;
    If Directory.Exists(strPath) Then&lt;br /&gt;
      If blnBinary Then&lt;br /&gt;
        If showDetail Then&lt;br /&gt;
          showMessage(&amp;quot;150 Opening Binary mode data connection /bin/ls.&amp;quot;)&lt;br /&gt;
        Else&lt;br /&gt;
          showMessage(&amp;quot;150 Opening Binary mode data connection for file list.&amp;quot;)&lt;br /&gt;
        End If&lt;br /&gt;
      Else&lt;br /&gt;
        If showDetail Then&lt;br /&gt;
          showMessage(&amp;quot;150 Opening ASCII mode data connection /bin/ls.&amp;quot;)&lt;br /&gt;
        Else&lt;br /&gt;
          showMessage(&amp;quot;150 Opening ASCII mode data connection for file list.&amp;quot;)&lt;br /&gt;
        End If&lt;br /&gt;
      End If&lt;br /&gt;
      Dim fileEntries As String() = Directory.GetFiles(strPath)&lt;br /&gt;
      Dim fileInfo As FileInfo&lt;br /&gt;
      Dim fileName As String&lt;br /&gt;
      Dim strName, strSize, strDate, strSpace As String&lt;br /&gt;
      For Each fileName In fileEntries&lt;br /&gt;
        If showDetail Then&lt;br /&gt;
          fileInfo = New FileInfo(fileName)&lt;br /&gt;
          strDate = Format(fileInfo.LastWriteTime, &amp;quot;MM-dd-yy  HH:mm&amp;quot;)&lt;br /&gt;
          strSize = fileInfo.Length.ToString&lt;br /&gt;
          strName = fileName.Substring(fileName.LastIndexOf(&amp;quot;\&amp;quot;) + 1)&lt;br /&gt;
          strSpace = New String(&amp;quot; &amp;quot;, 20 - strSize.Length)&lt;br /&gt;
          strBuff = strBuff &amp;amp; strDate &amp;amp; strSpace &amp;amp; strSize &amp;amp; &amp;quot; &amp;quot; &amp;amp; strName &amp;amp; ControlChars.CrLf&lt;br /&gt;
        Else&lt;br /&gt;
          strName = fileName.Substring(fileName.LastIndexOf(&amp;quot;\&amp;quot;) + 1)&lt;br /&gt;
          strBuff = strBuff &amp;amp; strName &amp;amp; ControlChars.CrLf&lt;br /&gt;
        End If&lt;br /&gt;
      Next fileName&lt;br /&gt;
      Dim dirEntries As String() = Directory.GetDirectories(strPath)&lt;br /&gt;
      Dim dirInfo As DirectoryInfo&lt;br /&gt;
      Dim dirName As String&lt;br /&gt;
      For Each dirName In dirEntries&lt;br /&gt;
        If showDetail Then&lt;br /&gt;
          dirInfo = New DirectoryInfo(dirName)&lt;br /&gt;
          strDate = Format(dirInfo.LastWriteTime, &amp;quot;MM-dd-yy  HH:mm&amp;quot;)&lt;br /&gt;
          strName = dirName.Substring(dirName.LastIndexOf(&amp;quot;\&amp;quot;) + 1)&lt;br /&gt;
          strBuff = strBuff &amp;amp; strDate &amp;amp; &amp;quot;       &amp;lt;DIR&amp;gt;         &amp;quot; &amp;amp; strName &amp;amp; ControlChars.CrLf&lt;br /&gt;
        Else&lt;br /&gt;
          strName = dirName.Substring(dirName.LastIndexOf(&amp;quot;\&amp;quot;) + 1)&lt;br /&gt;
          strBuff = strBuff &amp;amp; strName &amp;amp; ControlChars.CrLf&lt;br /&gt;
        End If&lt;br /&gt;
      Next dirName&lt;br /&gt;
      &amp;quot; Use data port to send path information &lt;br /&gt;
      showData(strBuff)&lt;br /&gt;
      Dim sendByte() As Byte = Encoding.Default.GetBytes(strBuff)&lt;br /&gt;
      showMessage(&amp;quot;226 Transfer complete.&amp;quot;)&lt;br /&gt;
      &amp;quot; Demo only&lt;br /&gt;
      showMessage(&amp;quot;ftp: &amp;quot; &amp;amp; sendByte.Length &amp;amp; &amp;quot; bytes received.&amp;quot;)&lt;br /&gt;
    Else&lt;br /&gt;
      showMessage(strPath &amp;amp; &amp;quot; is not a valid file or directory.&amp;quot;)&lt;br /&gt;
    End If&lt;br /&gt;
  End Sub&lt;br /&gt;
End Class&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>