2013-10-09 4 views
-1

Я не опытный программист в VB.Каким образом можно загружать несколько файлов в VB.NET?

Я создаю настольное приложение, где пользователь загружает некоторые файлы на сервер через ftp.

Файлы находятся в одной папке в локальной сети и загружаются в ту же папку на сервере.

По momment Я работаю с этим кодом:

For Each File As String In My.Computer.FileSystem.GetFiles(_ 
            path, _ 
            FileIO.SearchOption.SearchAllSubDirectories, _ 
            "*.jpg") 
    Dim fileInf As IO.FileInfo = New IO.FileInfo(File) 
    Dim uri As String = serveruri 
    Dim reqFTP As Net.FtpWebRequest 
    reqFTP = Net.FtpWebRequest.Create(New Uri(uri)) 
    reqFTP.Credentials = New Net.NetworkCredential(user, pass) 
    reqFTP.KeepAlive = False 
    reqFTP.Method = Net.WebRequestMethods.Ftp.UploadFile  
    reqFTP.UseBinary = True 
    reqFTP.ContentLength = fileInf.Length 
    Dim buffLength As Integer = 2048 
    Dim buff(buffLength) As Byte 
    Dim contentLen As Integer 
    Dim fs As IO.FileStream = fileInf.OpenRead() 
    Dim strm As IO.Stream = reqFTP.GetRequestStream() 
    contentLen = fs.Read(buff, 0, buffLength) 
    While Not (contentLen = 0) 
     strm.Write(buff, 0, contentLen) 
     contentLen = fs.Read(buff, 0, buffLength) 
    End While 
    strm.Close() 
    fs.Close()   
Next 

С помощью этого кода я загрузить один за файлы, но общее время потратили слишком большой.

Как я могу сократить общее время?

Я решил сделать это с помощью потоков или загрузить файлы несинхронно, но я не смог найти ни одного примера того, как это сделать.

Спасибо!

ответ

0

мы используем этот код, чтобы сделать подобную работу асинхронно:

w = New System.Net.WebClient 

     w.Credentials = New Net.NetworkCredential(username, Password) 

     w.UploadFileAsync(New System.Uri("ftp://ftp.yourdomain/yourfilename"), bupath) 
+0

Привет Питер, спасибо за нашу ansker. Я работаю с этим, и теперь у меня лучшие результаты. Я установил пустые учетные данные прокси с помощью w.prowx = new WebProxy() ', и я установил максимальное количество подключений на 30 с помощью' System.Net.ServicePointManager.DefaultConnectionLimit = 30' Я все еще работаю над этим! – user2862734

0

пользователей Мой FTP классу

Public Class FTP 
     '-------------------------[BroCode]-------------------------- 
     '----------------------------FTP----------------------------- 
     Private _credentials As System.Net.NetworkCredential 
     Sub New(ByVal _FTPUser As String, ByVal _FTPPass As String) 
      setCredentials(_FTPUser, _FTPPass) 
     End Sub 
     Public Sub UploadFile(ByVal _FileName As String, ByVal _UploadPath As String) 
      Dim _FileInfo As New System.IO.FileInfo(_FileName) 
      Dim _FtpWebRequest As System.Net.FtpWebRequest = CType(System.Net.FtpWebRequest.Create(New Uri(_UploadPath)), System.Net.FtpWebRequest) 
      _FtpWebRequest.Credentials = _credentials 
      _FtpWebRequest.KeepAlive = False 
      _FtpWebRequest.Timeout = 20000 
      _FtpWebRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile 
      _FtpWebRequest.UseBinary = True 
      _FtpWebRequest.ContentLength = _FileInfo.Length 
      Dim buffLength As Integer = 2048 
      Dim buff(buffLength - 1) As Byte 
      Dim _FileStream As System.IO.FileStream = _FileInfo.OpenRead() 
      Try 
       Dim _Stream As System.IO.Stream = _FtpWebRequest.GetRequestStream() 
       Dim contentLen As Integer = _FileStream.Read(buff, 0, buffLength) 
       Do While contentLen <> 0 
        _Stream.Write(buff, 0, contentLen) 
        contentLen = _FileStream.Read(buff, 0, buffLength) 
       Loop 
       _Stream.Close() 
       _Stream.Dispose() 
       _FileStream.Close() 
       _FileStream.Dispose() 
      Catch ex As Exception 
       MessageBox.Show(ex.Message, "Upload Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error) 
      End Try 
     End Sub 
     Public Sub DownloadFile(ByVal _FileName As String, ByVal _ftpDownloadPath As String) 
      Try 
       Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpDownloadPath) 
       _request.KeepAlive = False 
       _request.Method = System.Net.WebRequestMethods.Ftp.DownloadFile 
       _request.Credentials = _credentials 
       Dim _response As System.Net.FtpWebResponse = _request.GetResponse() 
       Dim responseStream As System.IO.Stream = _response.GetResponseStream() 
       Dim fs As New System.IO.FileStream(_FileName, System.IO.FileMode.Create) 
       responseStream.CopyTo(fs) 
       responseStream.Close() 
       _response.Close() 
      Catch ex As Exception 
       MessageBox.Show(ex.Message, "Download Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error) 
      End Try 
     End Sub 
     Public Function GetDirectory(ByVal _ftpPath As String) As List(Of String) 
      Dim ret As New List(Of String) 
      Try 
       Dim _request As System.Net.FtpWebRequest = System.Net.WebRequest.Create(_ftpPath) 
       _request.KeepAlive = False 
       _request.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails 
       _request.Credentials = _credentials 
       Dim _response As System.Net.FtpWebResponse = _request.GetResponse() 
       Dim responseStream As System.IO.Stream = _response.GetResponseStream() 
       Dim _reader As System.IO.StreamReader = New System.IO.StreamReader(responseStream) 
       Dim FileData As String = _reader.ReadToEnd 
       Dim Lines() As String = FileData.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries) 
       For Each l As String In Lines 
        ret.Add(l) 
       Next 
       _reader.Close() 
       _response.Close() 
      Catch ex As Exception 
       MessageBox.Show(ex.Message, "Directory Fetch Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error) 
      End Try 
      Return ret 
     End Function 

     Private Sub setCredentials(ByVal _FTPUser As String, ByVal _FTPPass As String) 
      _credentials = New System.Net.NetworkCredential(_FTPUser, _FTPPass) 
     End Sub 
    End Class 
Смежные вопросы