使用递归+.Net FtpWebRequest获得远程服务器的目录结构树!
TreeView1是.Net TreeView控件。请在WinForm界面上添加一个控件
Form1_load中的Dec是实例化ftpClient.vb的一个对象,ftpDetails是用来存储FTP登录凭据的。
1

Public Class Form1Class Form12

3
Dim ftp As ftpClient4
Dim LocalFileList As New DataTable5

6

Private Sub Form1_Load()Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load7
Dim Dec As New ftpClient.FtpDetails("www.cnblogs.com", 21, "cnblogVIP", "**********")8
ftp = New ftpClient(Dec)9
loadFtpTree(TreeView1.Nodes, "") '调用此代码可以装载远程FTP结构树10

11
End Sub12

13
'这个方法用于获得远程目录及文件树14

Private Sub loadFtpTree()Sub loadFtpTree(ByVal Nodes As TreeNodeCollection, ByVal Path As String)15
''获得各级分类16
Dim sNode As Integer = -117
''通过FTP获得当前目录列表18
Dim result As String = ftp.GetFileList(Path)19
Dim files() As String = Split(result, vbCrLf) '把FTP服务器返回的文本,分离出是目录还是文件,文件或目录名,文件大小20
Dim ffi As New ftpClient.FtpListFileInfo21
If files.Length > 0 Then22
'加载节点23
Dim I As Integer24
For I = 0 To files.Length - 225
ffi.ParserString(files(I)) '对返回的单行做分割。分离出是目录还是文件,文件或目录名,文件大小26
If ffi.IsDirectory = True And ffi.FileName <> ".." And ffi.FileName <> "." Then '如果是有效的目录。27
sNode += 128
Nodes.Add(0, ffi.FileName) '由于是目录,前面的参数保存了类似.Tag一样的作用,这里保存了文件的size29
Dim newpath As String = Path + "/" + ffi.FileName 'FileName如果是文件表示文件名,否则表示目录名30
Application.DoEvents()31
'读取当前节点的子节点加载()32
loadFtpTree(Nodes(sNode).Nodes, newpath) '递归检查当前目录下是否有子目录33
ElseIf ffi.IsDirectory = False Then '如果是文件34
sNode += 135
Nodes.Add(ffi.FileSize.ToString, ffi.FileName) '加入到节点中36
End If37
Next38
End If39
TreeView1.ExpandAll()40
End Sub
1
Imports System.Net2
Imports System.IO3

4

Public Class ftpClientClass ftpClient5

6
Public Ftp As FtpDetails = Nothing7

8
Private ftpNetworkCredential As New NetworkCredential9

10
Public Event ErrorMessage(ByVal Err As FtpError)11

12

Public Class FtpErrorClass FtpError13
Public ErrUrl As String = ""14
Public ErrMsg As String = ""15
Public Err As ErrType = ErrType.文件上传16

17

Public Enum ErrTypeEnum ErrType18
文件上传19
目录遍历20
目录创建21
列表清单22
End Enum23
End Class24

25

Public Sub New()Sub New(ByVal _FTPDetails As FtpDetails)26
ftpNetworkCredential.UserName = _FTPDetails.UserName27
ftpNetworkCredential.Password = _FTPDetails.PassWord28
Ftp = _FTPDetails29
End Sub30

31

Public Class FtpDetailsClass FtpDetails32
Private _Host As String = ""33
Private _Port As Integer = 034
Private _UserName As String = ""35
Private _PassWord As String = ""36

37

Public Sub New()Sub New(ByVal ftpHost As String, ByVal ftpPort As Integer, ByVal ftpUserName As String, ByVal ftpPassword As String)38
If ftpHost = "" Then39
Throw New Exception("请提供FTP服务器名称或地址!")40
End If41
If ftpPort <= 0 Or ftpPort > 65535 Then42
Throw New Exception("提供的端口不合法!")43
End If44
If ftpUserName = "" Then45
ftpUserName = "anonymous"46
End If47
If ftpPassword = "" Then48
ftpPassword = "abc@qq.com"49
End If50
_Host = ftpHost51
_Port = ftpPort52
_UserName = ftpUserName53
_PassWord = ftpPassword54
End Sub55

56

/**/''' <summary>57
''' 获得或设置FTP服务器IP地址(或域名)58
''' </summary>59
''' <value></value>60
''' <returns></returns>61
''' <remarks></remarks>62

Property Host()Property Host() As String63
Get64
Return _Host65
End Get66
Set(ByVal value As String)67
_Host = value68
End Set69
End Property70

71

/**/''' <summary>72
''' 获得或设置FTP服务器端口73
''' </summary>74
''' <value></value>75
''' <returns></returns>76
''' <remarks></remarks>77

Property Port()Property Port() As Integer78
Get79
Return _Port80
End Get81
Set(ByVal value As Integer)82
_Port = value83
End Set84
End Property85

86

/**/''' <summary>87
''' 获得或设置FTP登录密码88
''' </summary>89
''' <value></value>90
''' <returns></returns>91
''' <remarks></remarks>92

Property UserName()Property UserName() As String93
Get94
Return _UserName95
End Get96
Set(ByVal value As String)97
_UserName = value98
End Set99
End Property100

101

/**/''' <summary>102
''' 获得或设置FTP密码103
''' </summary>104
''' <value></value>105
''' <returns></returns>106
''' <remarks></remarks>107

Property PassWord()Property PassWord() As String108
Get109
Return _PassWord110
End Get111
Set(ByVal value As String)112
_PassWord = value113
End Set114
End Property115
End Class116

117

Public Function GetFileList()Function GetFileList(ByVal strPath As String) As String118
Try119
Dim ftpUri As String = "ftp://" + Ftp.Host + ":" + Ftp.Port.ToString120
If strPath <> "" Then121
ftpUri += "/" + strPath122
End If123
Dim uri As New Uri(ftpUri)124

125
Dim listRequest As FtpWebRequest '= DirectCast(WebRequest.Create(uri), FtpWebRequest)126
listRequest = FtpWebRequest.Create(uri)127
listRequest.Method = WebRequestMethods.Ftp.ListDirectoryDetails128

129
listRequest.Credentials = ftpNetworkCredential130
listRequest.UsePassive = True131
Dim listResponse As FtpWebResponse = DirectCast(listRequest.GetResponse(), FtpWebResponse)132
Dim responseStream As Stream = listResponse.GetResponseStream()133
Dim readStream As New StreamReader(responseStream, System.Text.Encoding.[Default])134

135
Dim Result As String = ""136
If readStream IsNot Nothing Then137
Result = readStream.ReadToEnd()138
End If139

140
'MessageBox.Show(String.Format("状态: {0},{1}", listResponse.StatusCode, listResponse.StatusDescription))141

142
listResponse.Close()143
responseStream.Close()144
readStream.Close()145
Return Result146
Catch ex As Exception147
Dim Err As New FtpError148
Err.ErrMsg = ex.Message149
Err.ErrUrl = strPath150
Err.Err = FtpError.ErrType.列表清单151
RaiseEvent ErrorMessage(Err)152
Return ""153
End Try154
End Function155

156

/**/''' <summary>157
''' STR Path是由/开头的一个基于根目录的地址158
''' </summary>159
''' <param name="strPath"></param>160
''' <returns></returns>161
''' <remarks></remarks>162

Public Function CreateDirectory()Function CreateDirectory(ByVal strPath As String) As Boolean163
Try164
Dim ftpUri As String = "ftp://" + Ftp.Host + ":" + Ftp.Port.ToString165
If strPath <> "" Then166
ftpUri += "/" + strPath167
End If168
Dim uri As New Uri(ftpUri)169

170
Dim listRequest As FtpWebRequest171
listRequest = FtpWebRequest.Create(uri)172
listRequest.Method = WebRequestMethods.Ftp.MakeDirectory173

174
listRequest.Credentials = ftpNetworkCredential175
listRequest.UsePassive = True176
Dim listResponse As FtpWebResponse = DirectCast(listRequest.GetResponse(), FtpWebResponse)177
'MessageBox.Show(String.Format("状态: {0},{1}", listResponse.StatusCode, listResponse.StatusDescription))178
listResponse.Close()179
Return True180
Catch ex As Exception181
Dim Err As New FtpError182
Err.ErrMsg = ex.Message183
Err.ErrUrl = strPath184
Err.Err = FtpError.ErrType.目录创建185
RaiseEvent ErrorMessage(Err)186
Return False187
End Try188
End Function189

190

Public Function uploadFile()Function uploadFile(ByVal strPath As String, ByVal strFullName As String) As Boolean191
Dim ftpUri As String = "ftp://" + Ftp.Host + ":" + Ftp.Port.ToString192
If strPath <> "" Then193
ftpUri += "/" + strPath194
End If195
Dim reqFTP As FtpWebRequest196
reqFTP = FtpWebRequest.Create(ftpUri)197
reqFTP.Credentials = ftpNetworkCredential198
reqFTP.KeepAlive = True199
reqFTP.Method = WebRequestMethods.Ftp.UploadFile200
reqFTP.UseBinary = True201
Dim f As New FileInfo(strFullName)202

203
reqFTP.ContentLength = f.Length204

205
Dim buffLength As Integer = 2048206
Dim buff(buffLength) As Byte207
Dim contentLen As Long208
Dim Fs As FileStream = f.OpenRead209
Try210
Dim strm As Stream = reqFTP.GetRequestStream()211
'每次读文件流的2KB212
contentLen = Fs.Read(buff, 0, buffLength)213
Dim StartBye As Long = 0214
While contentLen <> 0215
strm.Write(buff, 0, contentLen)216
contentLen = Fs.Read(buff, 0, buffLength)217
StartBye += contentLen218
End While219
Fs.Close()220
strm.Close()221
Return True222
Catch ex As Exception223
Dim Err As New FtpError224
Err.ErrMsg = ex.Message + " 本地文件:" + strFullName225
Err.ErrUrl = strPath226
Err.Err = FtpError.ErrType.文件上传227
RaiseEvent ErrorMessage(Err)228
Return False229
End Try230
End Function231

232

233

Public Class FtpListFileInfoClass FtpListFileInfo234
Public IsDirectory As Boolean = False235
Public FileSize As Long = 0236
Public FileName As String = ""237

238

Public Sub ParserString()Sub ParserString(ByVal str As String)239
If str = "" Then Exit Sub240
Try241
If Strings.Left(str, 1) = "d" Then242
IsDirectory = True243
Else244
IsDirectory = False245
End If246
'取得文件长度247
FileSize = CLng(Trim(Strings.Mid(str, 31, 12)))248
FileName = Trim(Strings.Right(str, str.Length - 55))249
Catch ex As Exception250
IsDirectory = False251
FileSize = 0252
FileName = ""253
End Try254
End Sub255
End Class256
End Class257


浙公网安备 33010602011771号