This class is FTP.
I hope it will help you and others.
Imports System.Net
Imports System
Imports System.IO
Imports System.Text
Imports System.Net.Sock ets
Public Class clsFTP
#Region "Main Class Variable Declarations"
Private m_sRemoteHost, m_sRemotePath, m_sRemoteUser As String
Private m_sRemotePasswo rd, m_sMess As String
Private m_iRemotePort, m_iBytes As Int32
Private m_objClientSock et As Socket
Private m_iRetValue As Int32
Private m_bLoggedIn As Boolean ' Change to loggedIn
Private m_sMes, m_sReply As String
Private FilePath As String
' Set the size of the packet that is used to read and
' write data to the FTP Server to the spcified size below.
Public Const BLOCK_SIZE = 512
Private m_aBuffer(BLOCK _SIZE) As Byte
Private ASCII As Encoding = Encoding.ASCII
' General variables
Private m_sMessageStrin g As String
#End Region
#Region "Class Constructors"
'
' Main class constructor.
Public Sub New()
m_sRemoteHost = "10.10.10.1 0"
m_sRemotePath = "."
m_sRemoteUser = "username"
m_sRemotePasswo rd = "password"
m_sMessageStrin g = ""
m_iRemotePort = 21
m_bLoggedIn = False
End Sub
' Parametized constructor.
Public Sub New(ByVal sRemoteHost As String, ByVal sRemotePath As
String, ByVal sRemoteUser As String, ByVal sRemotePassword As String,
ByVal iRemotePort As Int32)
m_sRemoteHost = sRemoteHost
m_sRemotePath = sRemotePath
m_sRemoteUser = sRemoteUser
m_sRemotePasswo rd = sRemotePassword
m_sMessageStrin g = ""
m_iRemotePort = iRemotePort
m_bLoggedIn = False
End Sub
#End Region
#Region "Public Properties"
'
' Set/Get the name of the FTP Server.
Public Property RemoteHost() As String
Get
Return m_sRemoteHost
End Get
Set(ByVal Value As String)
m_sRemoteHost = Value
End Set
End Property
' Set/Get the FTP Port Number.
Public Property RemotePort() As Int32
Get
Return m_iRemotePort
End Get
Set(ByVal Value As Int32)
m_iRemotePort = Value
End Set
End Property
' Set/Get the remote path.
Public Property RemotePath() As String
Get
Return m_sRemotePath
End Get
Set(ByVal Value As String)
m_sRemotePath = Value
End Set
End Property
' Set the remote password.
Public Property RemotePassword( ) As String
Get
Return m_sRemotePasswo rd
End Get
Set(ByVal Value As String)
m_sRemotePasswo rd = Value
End Set
End Property
' Set/Get the remote user.
Public Property RemoteUser() As String
Get
Return m_sRemoteUser
End Get
Set(ByVal Value As String)
m_sRemoteUser = Value
End Set
End Property
' Set the class messagestring.
Public Property MessageString() As String
Get
Return m_sMessageStrin g
End Get
Set(ByVal Value As String)
m_sMessageStrin g = Value
End Set
End Property
#End Region
#Region "Public Subs and Functions"
'
' Return a list of files within a string() array from the
' file system.
Public Function GetFileList(ByV al sMask As String) As String()
MsgBox(sMask)
Dim cSocket As Socket
Dim bytes As Int32
Dim seperator As Char = ControlChars.Lf
Dim mess() As String
m_sMes = ""
If (Not (m_bLoggedIn)) Then
Login()
End If
cSocket = CreateDataSocke t()
'SendCommand("{ ls -ls}")
If (Not (m_iRetValue = 150 Or m_iRetValue = 125)) Then
MessageString = m_sReply
Throw New IOException(m_s Reply.Substring (4))
End If
m_sMes = ""
Do While (True)
m_aBuffer.Clear (m_aBuffer, 0, m_aBuffer.Lengt h)
bytes = cSocket.Receive (m_aBuffer, m_aBuffer.Lengt h, 0)
m_sMes += ASCII.GetString (m_aBuffer, 0, bytes)
If (bytes < m_aBuffer.Lengt h) Then
Exit Do
End If
Loop
mess = m_sMes.Split(se perator)
cSocket.Close()
ReadReply()
If (m_iRetValue <> 226) Then
MessageString = m_sReply
Throw New IOException(m_s Reply.Substring (4))
End If
Return mess
End Function
'
' Get the size of the file on the FTP Server.
Public Function GetFileSize(ByV al sFileName As String) As Long
Dim size As Long
If (Not (m_bLoggedIn)) Then
Login()
End If
SendCommand("SI ZE " & sFileName)
size = 0
If (m_iRetValue = 213) Then
size = Int64.Parse(m_s Reply.Substring (4))
Else
MessageString = m_sReply
Throw New IOException(m_s Reply.Substring (4))
End If
Return size
End Function
Public Function GetFileDate(ByV al sFileName As String) As DateTime
If (Not (m_bLoggedIn)) Then
Login()
End If
SendCommand("MD TM " & sFileName)
Dim filepath As String = Me.m_sReply
Dim num2 As Integer = CInt(filepath.S ubstring(4, 4))
Dim num3 As Integer = CInt(filepath.S ubstring(8, 2))
Dim num4 As Integer = CInt(filepath.S ubstring(10, 2))
Dim num5 As Integer = CInt(filepath.S ubstring(12, 2))
Dim num6 As Integer = CInt(filepath.S ubstring(14, 2))
returnedfiledat e = DateTime.Parse( num3 & "/" & num4 & "/" & num2
& " " & num5 & ":" & num6)
Return returnedfiledat e
End Function
' Log into the FTP Server.
Public Function Login() As Boolean
m_objClientSock et = New Socket(AddressF amily.InterNetw ork,
SocketType.Stre am, ProtocolType.Tc p)
Dim ep As New
IPEndPoint(Dns. Resolve(m_sRemo teHost).Address List(0), m_iRemotePort)
Try
m_objClientSock et.Connect(ep)
Catch ex As Exception
MessageString = m_sReply
Throw New IOException("Co uldn't connect to remote server")
End Try
ReadReply()
If (m_iRetValue <> 220) Then
CloseConnection ()
MessageString = m_sReply
Throw New IOException(m_s Reply.Substring (4))
End If
SendCommand("US ER " & m_sRemoteUser)
If (Not (m_iRetValue = 331 Or m_iRetValue = 230)) Then
Cleanup()
MessageString = m_sReply
Throw New IOException(m_s Reply.Substring (4))
End If
If (m_iRetValue <> 230) Then
SendCommand("PA SS " & m_sRemotePasswo rd)
If (Not (m_iRetValue = 230 Or m_iRetValue = 202)) Then
Cleanup()
MessageString = m_sReply
Throw New IOException(m_s Reply.Substring (4))
End If
End If
m_bLoggedIn = True
ChangeDirectory (m_sRemotePath)
' Return the end result.
Return m_bLoggedIn
End Function
'
' If the value of mode is true, set binary mode for
' downloads.
' Else, set Ascii mode.
Public Sub SetBinaryMode(B yVal bMode As Boolean)
If (bMode) Then
SendCommand("TY PE I")
Else
SendCommand("TY PE A")
End If
If (m_iRetValue <> 200) Then
MessageString = m_sReply
Throw New IOException(m_s Reply.Substring (4))
End If
End Sub
'
' Download a file to the Assembly's local directory,
' keeping the same file name.
Public Sub DownloadFile(By Val sFileName As String)
DownloadFile(sF ileName, "", False)
End Sub
'
' Download a remote file to the Assembly's local
' directory, keeping the same file name, and set
' the resume flag.
Public Sub DownloadFile(By Val sFileName As String, ByVal bResume As
Boolean)
DownloadFile(sF ileName, "", bResume)
End Sub
'
' Download a remote file to a local file name which can
' include a path. The local file name will be created or
' overwritten, but the path must exist.
Public Sub DownloadFile(By Val sFileName As String, ByVal
sLocalFileName As String)
DownloadFile(sF ileName, sLocalFileName, False)
End Sub
'
' Download a remote file to a local file name which can
' include a path, and set the resume flag. The local file
' name will be created or overwritten, but the path must
' exist.
Public Sub DownloadFile(By Val sFileName As String, ByVal
sLocalFileName As String, ByVal bResume As Boolean)
Dim st As Stream
Dim output As FileStream
Dim cSocket As Socket
Dim offset, npos As Long
If (Not (m_bLoggedIn)) Then
Login()
End If
SetBinaryMode(T rue)
If (sLocalFileName .Equals("")) Then
sLocalFileName = sFileName
End If
If (Not (File.Exists(sL ocalFileName))) Then
st = File.Create(sLo calFileName)
st.Close()
End If
output = New FileStream(sLoc alFileName, FileMode.Open)
cSocket = CreateDataSocke t()
offset = 0
If (bResume) Then
offset = output.Length
If (offset > 0) Then
SendCommand("RE ST " & offset)
If (m_iRetValue <> 350) Then
'throw new IOException(rep ly.Substring(4) );
'Some servers may not support resuming.
offset = 0
End If
End If
If (offset > 0) Then
npos = output.Seek(off set, SeekOrigin.Begi n)
End If
End If
SendCommand("RE TR " & sFileName)
If (Not (m_iRetValue = 150 Or m_iRetValue = 125)) Then
MessageString = m_sReply
Throw New IOException(m_s Reply.Substring (4))
End If
Do While (True)
m_aBuffer.Clear (m_aBuffer, 0, m_aBuffer.Lengt h)
m_iBytes = cSocket.Receive (m_aBuffer, m_aBuffer.Lengt h, 0)
output.Write(m_ aBuffer, 0, m_iBytes)
If (m_iBytes <= 0) Then
Exit Do
End If
Loop
output.Close()
If (cSocket.Connec ted) Then
cSocket.Close()
End If
ReadReply()
If (Not (m_iRetValue = 226 Or m_iRetValue = 250)) Then
MessageString = m_sReply
Throw New IOException(m_s Reply.Substring (4))
End If
End Sub
'
' Upload a file.
Public Sub UploadFile(ByVa l sFileName As String)
UploadFile(sFil eName, False)
End Sub
'
' Upload a file and set the resume flag.
Public Sub UploadFile(ByVa l sFileName As String, ByVal bResume As
Boolean)
Dim cSocket As Socket
Dim offset As Long
Dim input As FileStream
Dim bFileNotFound As Boolean
If (Not (m_bLoggedIn)) Then
Login()
End If
cSocket = CreateDataSocke t()
offset = 0
If (bResume) Then
Try
SetBinaryMode(T rue)
offset = GetFileSize(sFi leName)
Catch ex As Exception
offset = 0
End Try
End If
If (offset > 0) Then
SendCommand("RE ST " & offset)
If (m_iRetValue <> 350) Then
'throw new IOException(rep ly.Substring(4) );
'Remote server may not support resuming.
offset = 0
End If
End If
SendCommand("ST OR " & Path.GetFileNam e(sFileName))
If (Not (m_iRetValue = 125 Or m_iRetValue = 150)) Then
MessageString = m_sReply
Throw New IOException(m_s Reply.Substring (4))
End If
' Check to see if the file exists before the upload.
bFileNotFound = False
If (File.Exists(sF ileName)) Then
' Open input stream to read source file
input = New FileStream(sFil eName, FileMode.Open)
If (offset <> 0) Then
input.Seek(offs et, SeekOrigin.Begi n)
End If
' Upload the file
m_iBytes = input.Read(m_aB uffer, 0, m_aBuffer.Lengt h)
Do While (m_iBytes > 0)
cSocket.Send(m_ aBuffer, m_iBytes, 0)
m_iBytes = input.Read(m_aB uffer, 0, m_aBuffer.Lengt h)
Loop
input.Close()
Else
bFileNotFound = True
End If
If (cSocket.Connec ted) Then
cSocket.Close()
End If
' No point in reading the return value if the file was
' not found.
If (bFileNotFound) Then
MessageString = m_sReply
Throw New IOException("Th e file: " & sFileName & " was not
found. Can not 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_s Reply.Substring (4))
End If
End Sub
'
' Delete a file from the remote FTP server.
Public Function DeleteFile(ByVa l sFileName As String) As Boolean
Dim bResult As Boolean
bResult = True
If (Not (m_bLoggedIn)) Then
Login()
End If
SendCommand("DE LE " & sFileName)
If (m_iRetValue <> 250) Then
bResult = False
MessageString = m_sReply
End If
' Return the final result.
Return bResult
End Function
'
' Rename a file on the remote FTP server.
Public Function RenameFile(ByVa l sOldFileName As String, ByVal
sNewFileName As String) As Boolean
Dim bResult As Boolean
bResult = True
If (Not (m_bLoggedIn)) Then
Login()
End If
SendCommand("RN FR " & sOldFileName)
If (m_iRetValue <> 350) Then
MessageString = m_sReply
Throw New IOException(m_s Reply.Substring (4))
End If
' known problem
' rnto will not take care of existing file.
' i.e. It will overwrite if newFileName exist
SendCommand("RN TO " & sNewFileName)
If (m_iRetValue <> 250) Then
MessageString = m_sReply
Throw New IOException(m_s Reply.Substring (4))
End If
Return bResult
End Function
'
' Create a directory on the remote FTP server.
Public Function CreateDirectory (ByVal sDirName As String) As Boolean
Dim bResult As Boolean
bResult = True
If (Not (m_bLoggedIn)) Then
Login()
End If
SendCommand("MK D " & sDirName)
If (m_iRetValue <> 257) Then
bResult = False
MessageString = m_sReply
End If
' Return the final result.
Return bResult
End Function
'
' Delete a directory on the remote FTP server.
Public Function RemoveDirectory (ByVal sDirName As String) As Boolean
Dim bResult As Boolean
bResult = True
If (Not (m_bLoggedIn)) Then
Login()
End If
SendCommand("RM D " & sDirName)
If (m_iRetValue <> 250) Then
bResult = False
MessageString = m_sReply
End If
' Return the final result.
Return bResult
End Function
'
' Change the current working directory on the remote FTP
' server.
Public Function ChangeDirectory (ByVal sDirName As String) As Boolean
Dim bResult As Boolean
bResult = True
If (sDirName.Equal s(".")) Then
Exit Function
End If
If (Not (m_bLoggedIn)) Then
Login()
End If
SendCommand("CW D " & sDirName)
If (m_iRetValue <> 250) Then
bResult = False
MessageString = m_sReply
End If
Me.m_sRemotePat h = sDirName
' Return the final result.
Return bResult
End Function
'
' Close the FTP connection.
Public Sub CloseConnection ()
If (Not (m_objClientSoc ket Is Nothing)) Then
SendCommand("QU IT")
End If
Cleanup()
End Sub
#End Region
#Region "Private Subs and Functions"
'
' Read the reply from the FTP Server
Private Sub ReadReply()
m_sMes = ""
m_sReply = ReadLine()
FilePath = m_sReply
m_iRetValue = Int32.Parse(m_s Reply.Substring (0, 3))
End Sub
'
' Clean up some variables.
Private Sub Cleanup()
If Not (m_objClientSoc ket Is Nothing) Then
m_objClientSock et.Close()
m_objClientSock et = Nothing
End If
m_bLoggedIn = False
End Sub
'
' Read a line from the server.
Private Function ReadLine(Option al 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_objClientSock et.Receive(m_aB uffer,
m_aBuffer.Lengt h, 0)
m_sMes += ASCII.GetString (m_aBuffer, 0, m_iBytes)
If (m_iBytes < m_aBuffer.Lengt h) Then
Exit Do
End If
Loop
mess = m_sMes.Split(se perator)
If (m_sMes.Length > 2) Then
m_sMes = mess(mess.Lengt h - 2)
Else
m_sMes = mess(0)
End If
If (Not (m_sMes.Substri ng(3, 1).Equals(" "))) Then
Return ReadLine(True)
End If
Return m_sMes
End Function
'
' Send a command to the FTP Server.
Private Sub SendCommand(ByV al sCommand As String)
sCommand = sCommand & ControlChars.Cr Lf
Dim cmdbytes As Byte() = ASCII.GetBytes( sCommand)
m_objClientSock et.Send(cmdbyte s, cmdbytes.Length , 0)
ReadReply()
End Sub
'
' Create a Data socket.
Private Function CreateDataSocke t() 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("PA SV")
If (m_iRetValue <> 227) Then
MessageString = m_sReply
Throw New IOException(m_s Reply.Substring (4))
End If
index1 = m_sReply.IndexO f("(")
index2 = m_sReply.IndexO f(")")
ipData = m_sReply.Substr ing(index1 + 1, index2 - index1 - 1)
len = ipData.Length
partCount = 0
buf = ""
For i = 0 To ((len - 1) And partCount <= 6)
ch = Char.Parse(ipDa ta.Substring(i, 1))
If (Char.IsDigit(c h)) Then
buf += ch
ElseIf (ch <> ",") Then
MessageString = m_sReply
Throw New IOException("Ma lformed 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("Ma lformed PASV reply: " &
m_sReply)
End Try
End If
Next
ipAddress = parts(0) & "." & parts(1) & "." & parts(2) & "." &
parts(3)
' Make this call in VB.NET 2002. We would like to
' bitshift the number by 8 bits, so in VB.NET 2002 we
' multiply the number by 2 to the power of 8.
'port = parts(4) * (2 ^ 8)
' Make this call and comment out the above line for
' VB.NET 2003.
port = parts(4) << 8
' Determine the data port number.
port = port + parts(5)
s = New Socket(AddressF amily.InterNetw ork, SocketType.Stre am,
ProtocolType.Tc p)
ep = New IPEndPoint(Dns. Resolve(ipAddre ss).AddressList (0), port)
Try
s.Connect(ep)
Catch ex As Exception
MessageString = m_sReply
MsgBox(ex.ToStr ing)
Throw New IOException("Ca n't connect to remote server")
End Try
Return s
End Function
#End Region
End Class
"RichardC" <Ri******@discu ssions.microsof t.com> wrote in message
news:96******** *************** ***********@mic rosoft.com:
Jen,
Is it working? I have the same problem - in the MS app, an error comes up
when trying to create a data socket (your given code). I manage to trace
it
to one of two causes: the target machine actively refusing connection, or
just taking too long to respond. For some reason, the error returned is
the
more general (and vague)
"Cannot connect to remote server". Damn irritating.
But I've tried it with four different FTP sites having verified usernames
and passwords and no-go. Unlikely that all four server names are changing.
So
if you have since figured it out, I'd appreciate you letting me know any
discoveries you've since made.
Cheers, Richard
PS! Is the "dim the lights" msg your own or an advertising blurb?
"Jen" wrote:
I think I have it working (so far anyway). It wasn't the code at all
- it was the server I was connecting to. Unbeknownst to me, comcast
had changed the name of their FTP servers from
"mywebpages.com cast.net" to "upload.comcast .net". Evidently it's
still a work in progress, as the "mywebpages " server will still come
up for directory functions, but won't allow me tp upload.
Thanks to everyone that tried to help, I do appreciate it!
(please send all replies via the newsgroup)
Dim the Lights & Save the Stars:
http://www.darksky.org/