【问题标题】:How to manipulate FTP files?如何操作FTP文件?
【发布时间】:2014-07-23 17:27:43
【问题描述】:

我是 VB.NET 的新手,在处理 FTP 文件时遇到了麻烦。

我需要一个连接服务器的功能,另一个用于列出文件的功能,另一个用于下载文件的功能,以及另一个用于发送电子邮件的功能。我做了很多研究,但到目前为止我所拥有的还不够。

对于我使用的连接:

Public Function OpenConnection(ByVal sServer As String, ByVal sUser As String, ByVal sPassword As String) As Boolean

    Try
        Dim requestAs FtpWebRequest = FtpWebRequest.Create(sServer)
        request.Credentials = New NetworkCredential(sUser, sPassword)
        fwr.KeepAlive = True

      OpenConnection = True

    Catch ex As Exception
        OpenConnection = False
    End Try
End Function

在将 "OpenConnection" 更改为 true 之前,如何确认它确实已连接?

列出我正在使用的文件:

Public Function GetDirectoryListing(ByVal sFilter As String, ByVal strServidor As String) As cDirList

    Try
        Dim fwr As FtpWebRequest = FtpWebRequest.Create(strServidor)
        fwr.Credentials = New NetworkCredential("user", "psswd")
        fwr.Method = WebRequestMethods.Ftp.ListDirectory

        Dim sr As New StreamReader(fwr.GetResponse().GetResponseStream())
        Dim str As String = sr.ReadLine()

        While Not str Is Nothing
            Console.WriteLine(str)
            str = sr.ReadLine()
        End While

        sr.Close()
        sr = Nothing
        fwr = Nothing
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Function

但是有了这个功能,我又重新连接了,不想那样做。我只想连接一次并保持连接,直到我使用完 FTP 服务器。这可能吗?

这也不起作用,这是我得到的错误:

远程服务器返回错误:(530) 未登录。

如果我要问的内容很简单,或者您不明白我要问的内容,我很抱歉。正如我之前所说,我是一个新手,英语不是我的第一语言。

【问题讨论】:

  • 我不确定这是否是最好的方法,但这个链接可能会有所帮助... [system-net-ftpclient-how-to-properly-stream-file]:stackoverflow.com/questions/22405825/…跨度>
  • 谢谢基思。我会看

标签: .net vb.net visual-studio-2008 ftp ftpwebrequest


【解决方案1】:

你是对的,这些都是菜鸟问题。

首先,了解变量的范围。如果你愿意:

Dim request As FtpWebRequest

..在同一类中的其他函数中可用,您需要在类级别将其设为 PRIVATE。然后你可以在你的其他功能中使用它。你也可以将它传递给你的方法,但这需要更多的知识。

至于第二种方法报错;看看这两行,告诉我有什么不同(除了变量名):

request.Credentials = New NetworkCredential(sUser, sPassword)
fwr.Credentials = New NetworkCredential("user", "psswd") 

第二个错误是使用“user”作为用户名和“pswd”作为密码连接到FTP服务器。我认为这些是不正确的。

【讨论】:

  • 史蒂夫。感谢您的回答,我正在寻找。在第二个示例中,我没有使用变量,而是使用服务器用户名和密码。
【解决方案2】:

没有太多理由让一个函数打开连接,只是为了调用另一个函数来获取目录列表。它们实际上应该是一个功能,因为我不知道如何检查连接是否实际打开。此外,这就是 Try/Catch 的用途。

Imports System.IO
Imports System.Net

    Private sDirectoryList() As String

    'Some method of starting the Connection, Listing, Downloads, etc.
    Private Sub btnFTP_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFTP.Click
        Dim sAddress As String = "ftp://address/"
        Dim sUserName As String = "user"
        Dim sPassword As String = "pass"
        Dim sLocalDirectory As String = "C:\"

        'If the initial connection opens, continue.
        'Although this isn't really necessary. It should be included in the GetDirectoryListing function
        If OpenConnection(sAddress, sUserName, sPassword) Then
            GetDirectoryListing()
            'DownloadAllFiles(sAddress, sUserName, sPassword, sLocalDirectory)
            'SendEmail()
            MessageBox.Show("Done.")
        End If
    End Sub

    Private Function OpenConnection(ByVal sServer As String, ByVal sUser As String, ByVal sPassword As String) As Boolean
        Try
            ftpRequest = FtpWebRequest.Create(New Uri(sServer))
            ftpRequest.Credentials = New NetworkCredential(sUser, sPassword)
            ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory 'List, not Download
            ftpRequest.KeepAlive = True
            ftpRequest.Proxy = Nothing
            ftpRequest.UseBinary = True
            Return True 'True, all worked
        Catch ex As WebException
            MessageBox.Show("Failed to connect to the FTP server. OpenConnection()")
            'MessageBox.Show(ex.ToString())
            Return False
        End Try
    End Function

    Private Sub GetDirectoryListing()
        Try
            'Read the contents of the directory and store it into a string array
            Dim srReader As New StreamReader(ftpRequest.GetResponse().GetResponseStream())
            sDirectoryList = srReader.ReadToEnd().Split(vbNewLine)

            'Clear the last split vbNewLine
            If sDirectoryList IsNot Nothing Then
                sDirectoryList(sDirectoryList.Length - 1) = ""
            End If

            srReader.Close()
            srReader = Nothing
            ftpRequest = Nothing
        Catch ex As WebException
            MessageBox.Show("Failed to get directory listing. GetDirectoryListing()")
            'MessageBox.Show(ex.ToString())
        End Try
    End Sub

End Class

综合路线:

    Private Function ConnectAndGetList(ByVal sServer As String, ByVal sUser As String, ByVal sPassword As String) As Boolean
        Try
            ftpRequest = FtpWebRequest.Create(New Uri(sServer))
            ftpRequest.Credentials = New NetworkCredential(sUser, sPassword)
            ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory 'List, not Download
            ftpRequest.KeepAlive = True
            ftpRequest.Proxy = Nothing
            ftpRequest.UseBinary = True

            'Read the contents of the directory and store it into a string array
            Dim srReader As New StreamReader(ftpRequest.GetResponse().GetResponseStream())
            sDirectoryList = srReader.ReadToEnd().Split(vbNewLine)

            'Clear the last split vbNewLine
            If sDirectoryList IsNot Nothing Then
                sDirectoryList(sDirectoryList.Length - 1) = ""
            End If

            srReader.Close()
            srReader = Nothing
            ftpRequest = Nothing
        Catch ex As WebException
            MessageBox.Show("Something failed in ConnectAndGetList()")
            'MessageBox.Show(ex.ToString())
        End Try
    End Sub

如果您只想要 *.txt 文件:

For Each sFile As String In sDirectoryList
    'Clear potential whitespace
    sFile = sFile.Trim()

    If sFile.EndsWith(".txt") Then
        'Read the file...
    End If
Next

【讨论】:

  • 非常感谢基思。这对我帮助很大。我知道我问的很多,但你知道我怎样才能只选择一种特定类型的文件。例如文件 *.txt.
  • 最后添加。基本上只是遍历 sDirectoryList 中的每个字符串并检查它是否以“.txt”结尾。请注意,这可能不是最有效的方法,但应该可以。
猜你喜欢
  • 1970-01-01
  • 2021-06-02
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多