Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从VB.NET中的FTP文件夹下载所有文件和子目录_.net_Vb.net_Ftp - Fatal编程技术网

从VB.NET中的FTP文件夹下载所有文件和子目录

从VB.NET中的FTP文件夹下载所有文件和子目录,.net,vb.net,ftp,.net,Vb.net,Ftp,我在互联网上搜索了我的问题,但我只找到了C#的答案,而没有找到VB.NET的答案 我想下载FTP服务器上目录的所有文件和子目录 我目前正在从我的FTP服务器下载一个ZIP文件并将其解压缩,但这不是一个好方法 谢谢 我知道你可能懒得读这些,但这就是答案!!!代码在末尾:D 你好, 使用可用于C#和VB.NET的WinSCP库非常简单-以下是完整答案: 首先,将WinSCP库安装到您的项目中,请参见此处: 或者,如果您懒得这么做,那么只需下载库并在项目中添加DLL文件作为引用 现在让我们将整个目录(

我在互联网上搜索了我的问题,但我只找到了C#的答案,而没有找到VB.NET的答案

我想下载FTP服务器上目录的所有文件和子目录

我目前正在从我的FTP服务器下载一个ZIP文件并将其解压缩,但这不是一个好方法

谢谢

我知道你可能懒得读这些,但这就是答案!!!代码在末尾:D

你好,

使用可用于C#和VB.NET的WinSCP库非常简单-以下是完整答案:

首先,将WinSCP库安装到您的项目中,请参见此处:

或者,如果您懒得这么做,那么只需下载库并在项目中添加DLL文件作为引用

现在让我们将整个目录(包括其文件和子目录)下载到本地存储

您有两种选择:

  • 即使文件和目录已下载,也要下载

  • 下载不存在的文件和目录,并下载已存在的修改文件。(最佳且优于第一个选项)

当然,我使用了第二种选择,因为它是有史以来最好的选择。但是,如果要使用Session.GetFiles方法。。。您可以在此处看到VB.NET示例:

下面是我如何使用第二个选项:

正如你所看到的,一切都解释得很好

基本上使用
同步本地
而不是
获取
同步远程
而不是
put

对于WinSCP.NET程序集,这意味着 Session.SynchronizeDirectory,参数模式设置为 SynchronizationMode。远程或SynchronizationMode。本地而不是 Session.GetFiles或Session.PutFiles

由于我想将文件从FTP服务器下载到本地PC上,所以我使用了以下内容(SynchronizeDirectory):

  • 是的!当然
    首先导入WinSCP
    :-)
  • 使用此代码,因为上的代码用于SFTP(端口22),而不是FTP(端口21)。。。它还使用了
    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
    
  • 不要忘记替换凭据和路径

    还有一件事吗?祝你的项目好运!:-)

    将我的答案翻译成VB.NET:

    FtpWebRequest
    不明确支持递归文件操作(包括下载)。您必须自己实现递归:

    • 列出远程目录
    • 迭代条目,下载文件并递归到子目录中(再次列出它们,等等)
    棘手的部分是从子目录中识别文件。使用
    FtpWebRequest
    无法以便携方式实现这一点。不幸的是,
    FtpWebRequest
    不支持
    MLSD
    命令,这是在FTP协议中检索具有文件属性的目录列表的唯一可移植方法。另见

    你的选择是:

    • 对文件名执行一个操作,该操作对于文件名肯定会失败,而对于目录则会成功(反之亦然)。即,您可以尝试下载“名称”。如果成功,它是一个文件,如果失败,它是一个目录
    • 您可能很幸运,在您的特定情况下,您可以通过文件名从目录中区分文件(即,您的所有文件都有扩展名,而子目录没有扩展名)
    • 使用长目录列表(
      LIST
      command=
      ListDirectoryDetails
      method)并尝试解析特定于服务器的列表。许多FTP服务器使用*nix样式的列表,您可以通过条目开头的
      d
      来标识目录。但许多服务器使用不同的格式。下面的示例使用这种方法(假设*nix格式)
    使用以下功能:

    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