Advertisement
Advertisement
|
[x]
Attachment Details
|
||
|
[x]
The Solution Rating System
|
||
|
With so many solutions, how can you tell which solutions are most likely to help you and which ones are not? To provide you with a tool to use, we rate our solutions based on various elements that most accurately determine if a solution is a quality solution. To explain what factors affect the solution rating, here are the elements we take into consideration when formulating our solution rating.
Your Input Matters If you have any suggestions that you would like to make for our rating system, please ask a question in the Suggestions Zone of Community Support. Thank you! |
||
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531: 532: 533: 534: 535: 536: 537: 538: 539: 540: 541: 542: 543: 544: 545: 546: 547: 548: 549: 550: 551: 552: 553: 554: 555: 556: 557: 558: 559: 560: 561: 562: 563: 564: 565: 566: 567: 568: 569: 570: 571: 572: 573: 574: 575: 576: 577: 578: 579: 580: 581: 582: 583: 584: 585: 586: 587: 588: 589: 590: 591: 592: 593: 594: 595: 596: 597: 598: 599: 600: 601: 602: 603: 604: 605: 606: 607: 608: 609: 610: 611: 612: 613: 614: 615: 616: 617: 618: 619: 620: 621: 622: 623: 624: 625: 626: 627: 628: 629: 630: 631: 632: 633: 634: 635: 636: 637: 638: 639: 640: 641: 642: 643: 644: 645: 646: 647: 648: 649: 650: 651: 652: 653: 654: 655: 656: 657: 658: 659: 660: 661: 662: 663: 664: 665: 666: 667: 668: |
Public Class Ftp
Private m_sRemoteHost, m_sRemotePath, m_sRemoteUser As String
Private m_sRemotePassword, m_sMess As String
Private m_iRemotePort, m_iBytes As Int32
Private m_objClientSocket As System.Net.Sockets.Socket
Private m_iRetValue As Int32
Private m_bLoggedIn As Boolean
Private m_sMes, m_sReply As String
'Set the size of the packet that is used to read and to write data to the FTP server
'to the following specified size.
Public Const BLOCK_SIZE As Integer = 512
Private m_aBuffer(BLOCK_SIZE) As Byte
Private ASCII As System.Text.Encoding = System.Text.Encoding.ASCII
Public flag_bool As Boolean
'General variable declaration
Private m_sMessageString As String
' Parameterized constructor
Public Sub New(ByVal sRemoteHost As String, _
ByVal sRemoteUser As String, _
ByVal sRemotePassword As String, _
ByVal iRemotePort As Int32, _
ByVal sRemotePath As String)
m_sRemoteHost = sRemoteHost
m_sRemotePath = sRemotePath
m_sRemoteUser = sRemoteUser
m_sRemotePassword = sRemotePassword
m_sMessageString = ""
m_iRemotePort = iRemotePort
m_bLoggedIn = False
End Sub
'Set or Get the name of the FTP server that you want to connect.
Public Property RemoteHostFTPServer() As String
'Get the name of the FTP server.
Get
Return m_sRemoteHost
End Get
'Set the name of the FTP server.
Set(ByVal Value As String)
m_sRemoteHost = Value
End Set
End Property
'Set or Get the FTP Port Number of the FTP server that you want to connect.
Public Property RemotePort() As Int32
'Get the FTP Port Number.
Get
Return m_iRemotePort
End Get
'Set the FTP Port Number.
Set(ByVal Value As Int32)
m_iRemotePort = Value
End Set
End Property
'Set or Get the remote path of the FTP server that you want to connect.
Public Property RemotePath() As String
'Get the remote path.
Get
Return m_sRemotePath
End Get
'Set the remote path.
Set(ByVal Value As String)
m_sRemotePath = Value
End Set
End Property
'Set or Get the remote password of the FTP server that you want to connect.
Public Property RemotePassword() As String
Get
Return m_sRemotePassword
End Get
Set(ByVal Value As String)
m_sRemotePassword = Value
End Set
End Property
'Set or Get the remote user of the FTP server that you want to connect.
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_sMessageString
End Get
Set(ByVal Value As String)
m_sMessageString = Value
End Set
End Property
'Return a list of files in a string() array from the file system.
Public Function GetFileList(ByVal sMask As String) As String()
Dim cSocket As System.Net.Sockets.Socket
Dim bytes As Int32
Dim seperator As Char = ControlChars.Lf
Dim mess() As String
m_sMes = ""
'Check if you are logged on to the FTP server.
If (Not (m_bLoggedIn)) Then
Login()
End If
cSocket = CreateDataSocket()
'Send an FTP command,
SendCommand("NLST " & sMask)
If (Not (m_iRetValue = 150 Or m_iRetValue = 125)) Then
MessageString = m_sReply
Throw New System.IO.IOException(m_sReply.Substring(4))
End If
m_sMes = ""
Do While (True)
Array.Clear(m_aBuffer, 0, m_aBuffer.Length)
bytes = cSocket.Receive(m_aBuffer, m_aBuffer.Length, 0)
m_sMes += ASCII.GetString(m_aBuffer, 0, bytes)
If (bytes < m_aBuffer.Length) Then
Exit Do
End If
Loop
mess = m_sMes.Split(seperator)
cSocket.Close()
ReadReply()
If (m_iRetValue <> 226) Then
MessageString = m_sReply
Throw New System.IO.IOException(m_sReply.Substring(4))
End If
Return mess
End Function
' Get the size of the file on the FTP server.
Public Function GetFileSize(ByVal sFileName As String) As Long
Dim size As Long
If (Not (m_bLoggedIn)) Then
Login()
End If
'Send an FTP command.
SendCommand("SIZE " & sFileName)
size = 0
If (m_iRetValue = 213) Then
size = Int64.Parse(m_sReply.Substring(4))
Else
MessageString = m_sReply
Throw New System.IO.IOException(m_sReply.Substring(4))
End If
Return size
End Function
'Log on to the FTP server.
Public Function Login() As Boolean
m_objClientSocket = New System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp)
Dim ep As New System.Net.IPEndPoint(Net.IPAddress.Parse(m_sRemoteHost), m_iRemotePort)
Try
m_objClientSocket.Connect(ep)
Catch ex As Exception
MessageString = m_sReply
Throw New System.IO.IOException("Cannot connect to remote server")
End Try
ReadReply()
If (m_iRetValue <> 220) Then
CloseConnection()
MessageString = m_sReply
Throw New System.IO.IOException(m_sReply.Substring(4))
End If
'Send an FTP command to send a user logon ID to the server.
SendCommand("USER " & m_sRemoteUser)
If (Not (m_iRetValue = 331 Or m_iRetValue = 230)) Then
Cleanup()
MessageString = m_sReply
Throw New System.IO.IOException(m_sReply.Substring(4))
End If
If (m_iRetValue <> 230) Then
'Send an FTP command to send a user logon password to the server.
SendCommand("PASS " & m_sRemotePassword)
If (Not (m_iRetValue = 230 Or m_iRetValue = 202)) Then
Cleanup()
MessageString = m_sReply
Throw New System.IO.IOException(m_sReply.Substring(4))
End If
End If
m_bLoggedIn = True
'Call the ChangeDirectory user-defined function to change the folder to the
'remote FTP folder that is mapped.
ChangeDirectory(m_sRemotePath)
'Return the final result.
Return m_bLoggedIn
End Function
'If the value of mode is true, set the binary mode for downloads. Otherwise, set ASCII mode.
Public Sub SetBinaryMode(ByVal bMode As Boolean)
If (bMode) Then
'Send the FTP command to set the binary mode.
'(TYPE is an FTP command that is used to specify representation type.)
SendCommand("TYPE I")
Else
'Send the FTP command to set ASCII mode.
'(TYPE is a FTP command that is used to specify representation type.)
SendCommand("TYPE A")
End If
If (m_iRetValue <> 200) Then
MessageString = m_sReply
Throw New System.IO.IOException(m_sReply.Substring(4))
End If
End Sub
Public Sub SetSiteFileType(ByVal FileType As String)
Dim cmdString As New System.Text.StringBuilder
cmdString.Append("site filetype=").Append(FileType)
SendCommand(cmdString.ToString)
If (m_iRetValue <> 200) Then
MessageString = m_sReply
Throw New System.IO.IOException(m_sReply.Substring(4))
End If
End Sub
' Download a file to the local folder of the assembly, and keep the same file name.
Public Sub DownloadFile(ByVal sFileName As String)
DownloadFile(sFileName, "", False)
End Sub
' Download a remote file to the local folder of the assembly, and keep the same file name.
Public Sub DownloadFile(ByVal sFileName As String, _
ByVal bResume As Boolean)
DownloadFile(sFileName, "", bResume)
End Sub
'Download a remote file to a local file name. You must include a path.
'The local file name will be created or will be overwritten, but the path must exist.
Public Sub DownloadFile(ByVal sFileName As String, _
ByVal sLocalFileName As String)
DownloadFile(sFileName, sLocalFileName, False)
End Sub
' Download a remote file to a local file name and include a path. Then, set the
' resume flag. The local file name will be created or will be overwritten, but the path must exist.
Public Sub DownloadFile(ByVal sFileName As String, _
ByVal sLocalFileName As String, _
ByVal bResume As Boolean)
Dim st As System.IO.Stream
Dim output As System.IO.FileStream
Dim cSocket As System.Net.Sockets.Socket
Dim offset, npos As Long
If (Not (m_bLoggedIn)) Then
Login()
End If
'SetBinaryMode(True)
If (sLocalFileName.Equals("")) Then
sLocalFileName = sFileName
End If
If (Not (System.IO.File.Exists(sLocalFileName))) Then
st = System.IO.File.Create(sLocalFileName)
st.Close()
End If
output = New System.IO.FileStream(sLocalFileName, System.IO.FileMode.Open)
cSocket = CreateDataSocket()
offset = 0
If (bResume) Then
offset = output.Length
If (offset > 0) Then
'Send an FTP command to restart.
SendCommand("REST " & offset)
If (m_iRetValue <> 350) Then
offset = 0
End If
End If
If (offset > 0) Then
npos = output.Seek(offset, System.IO.SeekOrigin.Begin)
End If
End If
'Send an FTP command to retrieve a file.
SendCommand("RETR " & sFileName)
If (Not (m_iRetValue = 150 Or m_iRetValue = 125)) Then
output.Close()
MessageString = m_sReply
Throw New System.IO.IOException(m_sReply.Substring(4))
End If
Do While (True)
Array.Clear(m_aBuffer, 0, m_aBuffer.Length)
m_iBytes = cSocket.Receive(m_aBuffer, m_aBuffer.Length, 0)
output.Write(m_aBuffer, 0, m_iBytes)
If (m_iBytes <= 0) Then
Exit Do
End If
Loop
output.Close()
If (cSocket.Connected) Then
cSocket.Close()
End If
ReadReply()
If (Not (m_iRetValue = 226 Or m_iRetValue = 250)) Then
MessageString = m_sReply
Throw New System.IO.IOException(m_sReply.Substring(4))
End If
End Sub
' Delete a file from the remote FTP server.
Public Function DeleteFile(ByVal sFileName As String) As Boolean
Dim bResult As Boolean
bResult = True
If (Not (m_bLoggedIn)) Then
Login()
End If
'Send an FTP command to delete a file.
SendCommand("DELE " & 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(ByVal sOldFileName As String, _
ByVal sNewFileName As String) As Boolean
Dim bResult As Boolean
bResult = True
If (Not (m_bLoggedIn)) Then
Login()
End If
'Send an FTP command to rename a file.
SendCommand("RNFR " & sOldFileName)
If (m_iRetValue <> 350) Then
MessageString = m_sReply
Throw New System.IO.IOException(m_sReply.Substring(4))
End If
'Send an FTP command to rename a file to a file name.
'It will overwrite if newFileName exists.
SendCommand("RNTO " & sNewFileName)
If (m_iRetValue <> 250) Then
MessageString = m_sReply
Throw New System.IO.IOException(m_sReply.Substring(4))
End If
' Return the final result.
Return bResult
End Function
'This is a function that is used to create a folder 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
'Send an FTP command to make a folder on the FTP server.
SendCommand("MKD " & sDirName)
If (m_iRetValue <> 257) Then
bResult = False
MessageString = m_sReply
End If
' Return the final result.
Return bResult
End Function
' This is a function that is used to delete a folder on the remote FTP server.
Public Function RemoveDirectory(ByVal sDirName As String) As Boolean
Dim bResult As Boolean
bResult = True
'Check if you are logged on to the FTP server.
If (Not (m_bLoggedIn)) Then
Login()
End If
'Send an FTP command to remove a folder on the FTP server.
SendCommand("RMD " & sDirName)
If (m_iRetValue <> 250) Then
bResult = False
MessageString = m_sReply
End If
' Return the final result.
Return bResult
End Function
'This is a function that is used to change the current working folder on the remote FTP server.
Public Function ChangeDirectory(ByVal sDirName As String) As Boolean
Dim bResult As Boolean
bResult = True
'Check if you are in the root directory.
If (sDirName.Equals(".")) Then
Exit Function
End If
'Check if you are logged on to the FTP server.
If (Not (m_bLoggedIn)) Then
Login()
End If
'Send an FTP command to change the folder on the FTP server.
SendCommand("CWD " & sDirName)
If (m_iRetValue <> 250) Then
bResult = False
MessageString = m_sReply
End If
Me.m_sRemotePath = sDirName
' Return the final result.
Return bResult
End Function
' Close the FTP connection of the remote server.
Public Sub CloseConnection()
If (Not (m_objClientSocket Is Nothing)) Then
'Send an FTP command to end an FTP server system.
SendCommand("QUIT")
End If
Cleanup()
End Sub
' Read the reply from the FTP server.
Private Sub ReadReply()
m_sMes = ""
m_sReply = ReadLine()
m_iRetValue = Int32.Parse(m_sReply.Substring(0, 3))
End Sub
' Clean up some variables.
Private Sub Cleanup()
If Not (m_objClientSocket Is Nothing) Then
m_objClientSocket.Close()
m_objClientSocket = Nothing
End If
m_bLoggedIn = False
End Sub
' Read a line from the FTP server.
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)
Array.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
'TODO fix problem reading zero length field
If (Not (m_sMes.Substring(3, 1).Equals(" "))) Then
Return ReadLine(True)
End If
Return m_sMes
End Function
' This is a function that is used to send a command to the FTP server that you are connected to.
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
' Create a data socket.
Private Function CreateDataSocket() As System.Net.Sockets.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 System.Net.Sockets.Socket
Dim ep As System.Net.IPEndPoint
'Send an FTP command to use a passive data connection.
SendCommand("PASV")
If (m_iRetValue <> 227) Then
MessageString = m_sReply
Throw New System.IO.IOException(m_sReply.Substring(4))
End If
index1 = m_sReply.IndexOf("(")
index2 = m_sReply.IndexOf(")")
ipData = m_sReply.Substring(index1 + 1, index2 - index1 - 1)
len = ipData.Length
partCount = 0
buf = ""
For i = 0 To len - 1
If partCount > 6 Then
Exit For
End If
ch = Char.Parse(ipData.Substring(i, 1))
If (Char.IsDigit(ch)) Then
buf += ch
ElseIf (ch <> ",") Then
MessageString = m_sReply
Throw New System.IO.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 System.IO.IOException("Malformed PASV reply: " & m_sReply)
End Try
End If
Next
ipAddress = parts(0) & "." & parts(1) & "." & parts(2) & "." & parts(3)
' Make this call in Visual Basic .NET 2002. You want to
' bitshift the number by 8 bits. Therefore, in Visual Basic .NET 2002, you must
' multiply the number by 2 to the power of 8.
'port = parts(4) * (2 ^ 8)
' Make this call and then comment out the previous line for Visual Basic .NET 2003.
port = parts(4) << 8
' Determine the data port number.
port = port + parts(5)
s = New System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp)
'ep = New System.Net.IPEndPoint(Dns.Resolve(ipAddress).AddressList(0), port)
ep = New System.Net.IPEndPoint(Net.IPAddress.Parse(ipAddress), port)
Try
s.Connect(ep) /// ********* THIS IS THE PROBLEM LINE - EP.port is not 21 - so this hits windows firewall and times out ********** ////////
Catch ex As Exception
MessageString = m_sReply
Throw New System.IO.IOException("Cannot connect to remote server")
'If you cannot connect to the FTP
'server that is specified, make the boolean variable false.
flag_bool = False
End Try
'If you can connect to the FTP server that is specified, make the boolean variable true.
flag_bool = True
Return s
End Function
Public Sub UploadFile(ByVal sFileName As String, ByVal sUploadName As String, _
ByVal bResume As Boolean)
Dim cSocket As System.Net.Sockets.Socket
Dim offset As Long
Dim input As System.IO.FileStream
Dim bFileNotFound As Boolean
If (Not (m_bLoggedIn)) Then
Login()
End If
cSocket = CreateDataSocket()
offset = 0
If (bResume) Then
Try
'SetBinaryMode(True)
offset = GetFileSize(sFileName)
Catch ex As Exception
offset = 0
End Try
End If
If (offset > 0) Then
SendCommand("REST " & offset)
If (m_iRetValue <> 350) Then
'The remote server may not support resuming.
offset = 0
End If
End If
'Send an FTP command to store a file.
SendCommand("STOR " & sUploadName)
If (Not (m_iRetValue = 125 Or m_iRetValue = 150)) Then
MessageString = m_sReply
Throw New System.IO.IOException(m_sReply.Substring(4))
End If
'Check to see if the file exists before the upload.
bFileNotFound = False
If (System.IO.File.Exists(sFileName)) Then
' Open the input stream to read the source file.
input = New System.IO.FileStream(sFileName, System.IO.FileMode.Open)
If (offset <> 0) Then
input.Seek(offset, System.IO.SeekOrigin.Begin)
End If
'Upload the file.
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
'Check the return value if the file was not found.
If (bFileNotFound) Then
MessageString = m_sReply
Throw New System.IO.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 System.IO.IOException(m_sReply.Substring(4))
End If
End Sub
End Class
|