从VB.NET中的FTP文件夹下载所有文件和子目录
我在互联网上搜索了我的问题,但我只找到了C#的答案,而没有找到VB.NET的答案 我想下载FTP服务器上目录的所有文件和子目录 我目前正在从我的FTP服务器下载一个ZIP文件并将其解压缩,但这不是一个好方法 谢谢 我知道你可能懒得读这些,但这就是答案!!!代码在末尾:D 你好, 使用可用于C#和VB.NET的WinSCP库非常简单-以下是完整答案: 首先,将WinSCP库安装到您的项目中,请参见此处: 或者,如果您懒得这么做,那么只需下载库并在项目中添加DLL文件作为引用 现在让我们将整个目录(包括其文件和子目录)下载到本地存储 您有两种选择:从VB.NET中的FTP文件夹下载所有文件和子目录,.net,vb.net,ftp,.net,Vb.net,Ftp,我在互联网上搜索了我的问题,但我只找到了C#的答案,而没有找到VB.NET的答案 我想下载FTP服务器上目录的所有文件和子目录 我目前正在从我的FTP服务器下载一个ZIP文件并将其解压缩,但这不是一个好方法 谢谢 我知道你可能懒得读这些,但这就是答案!!!代码在末尾:D 你好, 使用可用于C#和VB.NET的WinSCP库非常简单-以下是完整答案: 首先,将WinSCP库安装到您的项目中,请参见此处: 或者,如果您懒得这么做,那么只需下载库并在项目中添加DLL文件作为引用 现在让我们将整个目录(
- 即使文件和目录已下载,也要下载
- 下载不存在的文件和目录,并下载已存在的修改文件。(最佳且优于第一个选项)
同步本地
而不是获取
和同步远程
而不是put
对于WinSCP.NET程序集,这意味着
Session.SynchronizeDirectory,参数模式设置为
SynchronizationMode。远程或SynchronizationMode。本地而不是
Session.GetFiles或Session.PutFiles
由于我想将文件从FTP服务器下载到本地PC上,所以我使用了以下内容(SynchronizeDirectory):
首先导入WinSCP
:-)SynchronizeMode.Remote
,它可以从您的电脑上传到FTP服务器,因此在下面的代码中,我将.Remote
替换为.Local
Public Shared Function Main() As Integer
Try
' Setup session options
Dim sessionOptions As New SessionOptions
With sessionOptions
.Protocol = Protocol.Ftp
.HostName = "example.com"
.UserName = "user"
.Password = "mypassword"
End With
Using session As New Session
' Will continuously report progress of synchronization
AddHandler session.FileTransferred, AddressOf FileTransferred
' Connect
session.Open(sessionOptions)
' Synchronize files
Dim synchronizationResult As SynchronizationResult
synchronizationResult = _
session.SynchronizeDirectories( _
SynchronizationMode.Local, "d:\www", "/home/martin/public_html", False)
' Throw on any error
synchronizationResult.Check()
End Using
Return 0
Catch e As Exception
Console.WriteLine("Error: {0}", e)
Return 1
End Try
End Function
Private Shared Sub FileTransferred(ByVal sender As Object, ByVal e As TransferEventArgs)
If e.Error Is Nothing Then
'Console.WriteLine("Upload of {0} succeeded", e.FileName)
Else
'Console.WriteLine("Upload of {0} failed: {1}", e.FileName, e.Error)
End If
If e.Chmod IsNot Nothing Then
If e.Chmod.Error Is Nothing Then
'Console.WriteLine("Permisions of {0} set to {1}", e.Chmod.FileName, e.Chmod.FilePermissions)
Else
'Console.WriteLine("Setting permissions of {0} failed: {1}", e.Chmod.FileName, e.Chmod.Error)
End If
Else
'Console.WriteLine("Permissions of {0} kept with their defaults", e.Destination)
End If
If e.Touch IsNot Nothing Then
If e.Touch.Error Is Nothing Then
'Console.WriteLine("Timestamp of {0} set to {1}", e.Touch.FileName, e.Touch.LastWriteTime)
Else
'Console.WriteLine("Setting timestamp of {0} failed: {1}", e.Touch.FileName, e.Touch.Error)
End If
Else
' This should never happen during "local to remote" synchronization
'Console.WriteLine("Timestamp of {0} kept with its default (current time)", e.Destination)
End If
End Sub
FtpWebRequest
不明确支持递归文件操作(包括下载)。您必须自己实现递归:
- 列出远程目录
- 迭代条目,下载文件并递归到子目录中(再次列出它们,等等)
FtpWebRequest
无法以便携方式实现这一点。不幸的是,FtpWebRequest
不支持MLSD
命令,这是在FTP协议中检索具有文件属性的目录列表的唯一可移植方法。另见
你的选择是:
- 对文件名执行一个操作,该操作对于文件名肯定会失败,而对于目录则会成功(反之亦然)。即,您可以尝试下载“名称”。如果成功,它是一个文件,如果失败,它是一个目录李>
- 您可能很幸运,在您的特定情况下,您可以通过文件名从目录中区分文件(即,您的所有文件都有扩展名,而子目录没有扩展名)
- 使用长目录列表(
command=LIST
method)并尝试解析特定于服务器的列表。许多FTP服务器使用*nix样式的列表,您可以通过条目开头的ListDirectoryDetails
来标识目录。但许多服务器使用不同的格式。下面的示例使用这种方法(假设*nix格式)d
Dim credentials As NetworkCredential = New NetworkCredential("user", "mypassword")
Dim url As String = "ftp://ftp.example.com/directory/to/download/"
DownloadFtpDirectory(url, credentials, "C:\target\directory")
如果要避免解析特定于服务器的目录列表格式时出现问题,请使用支持
MLSD
命令和/或解析各种LIST
列表格式的第三方库;和递归下载
例如,使用,只需一次调用即可下载整个目录:
在内部,如果服务器支持,WinSCP使用MLSD
命令。如果没有,它将使用LIST
命令并支持几十种不同的列表格式
默认情况下,是递归的
(我是WinSCP的作者)请参阅。此返回550文件的可能副本不可用:(你所说的“This”指的是什么?我的答案中有两种完全不同的解决方案。你指的是哪一种?
Dim credentials As NetworkCredential = New NetworkCredential("user", "mypassword")
Dim url As String = "ftp://ftp.example.com/directory/to/download/"
DownloadFtpDirectory(url, credentials, "C:\target\directory")
' Setup session options
Dim SessionOptions As SessionOptions = New SessionOptions
With SessionOptions
.Protocol = Protocol.Ftp
.HostName = "ftp.example.com"
.UserName = "user"
.Password = "mypassword"
End With
Using session As Session = New Session()
' Connect
session.Open(SessionOptions)
' Download files
session.GetFiles("/directory/to/download/*", "C:\target\directory\*").Check()
End Using