n° 219
Novembre 2017
Dicembre 12, 2017, 09:54:14 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Scaricare simultaneamente più file con VB.Net  (Letto 2649 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
SimoneVB
Sr. Member
****

Karma: +3/-0
Scollegato Scollegato

Messaggi: 787


simonevb@live.it
Mostra profilo
« inserita:: Febbraio 08, 2017, 01:05:06 »

Quante volte ci capita di dovere effettuare il download di più file tramite VB.Net.
E quante volte abbiamo scritto un codice che effettuava i download in sequenza.
Bene, per farvi risparmiare tempo e per rendere la vostra applicazione più veloce, eccovi un semplice tip per lanciare il download simultaneo di più file, e attenderne il completamento.

Premessa
la funzione richiede che si imposti su App.Config il parametro "maxconnection" di System.Net , settandolo sul numero massimo di connessioni simultanee che l'applicazione dovrà gestire.
Ad esempio 10

Codice:
  <system.net> 
      <connectionManagement> 
        <add address = "*" maxconnection = "10" /> 
      </connectionManagement> 
    </system.net> 
Naturalmente, questo xml dovrà essere inserito tra i tag <configuration> e </configuration>

Passiamo al codice VB!

La funzione principale del nostro codice, DownloadMultiple, avrà la seguente signature
Codice:
Function DownloadMultiple(ByVal UrlAndFileList As Dictionary(Of String, String), ByRef TotalSize As Int32) As Int32

Dove
- UrlAndFileList è un oggetto dictiorary che dovrà essere stato precedentemente popolato con una coppia url-di-origine > percorso-file, per ogni file che si intende scaricare

- TotalSize restituisce la dimensione totale (in bytes) dei file scaricati

Mentre la funzione restituisce il numero di file scaricati.

Vediamo un esempio di chiamata di questa funzione
Codice:
' Prepara il dictionary per il download simultaneo dei file
"amici.txt", "parenti.txt", "colleghi.txt" dal sito miosito.com,
' salvandoli su C rispettivamente come "amici.txt", "parenti.txt", "colleghi_csv.csv"

Dim lstDownloads As New Dictionary(Of String, String)
lstDownloads.Add("http://miosito.com/amici.txt", "c:\amici.txt")
lstDownloads.Add("http://miosito.com/parenti.txt", "c:\parenti.txt")
lstDownloads.Add("http://miosito.com/colleghi.txt", "c:\colleghi_csv.csv")

' Mostra esito funzione: numero file scaricati, e dimensioni totali
Dim lFiles As Int32, lSize As Int32 = 0
lFiles = DownloadMultiple(lstDownloads, lSize)

Debug.Print("Scaricati {0} file ({1} bytes)", lFiles, lSize)

Ed ecco qui il codice che rende possibile tutto ciò

Codice:

    Dim mlMDDownloadsDone As Int32 = 0
    Dim mlMDDownloadsToTo As Int32 = 0
    Dim mlDownloadTotalSize As Int32 = 0

    ''' <summary>
    ''' Downloads mulitple files simultaneously
    ''' </summary>
    ''' <param name="UrlAndFileList">Dictiory of url and filename (to save)</param>
    ''' <param name="TotalSize">Return the total size of downloaded files</param>
    ''' <returns></returns>
    Function DownloadMultiple(ByVal UrlAndFileList As Dictionary(Of String, String), ByRef TotalSize As Int32) As Int32

        ' NOTE: this requires System.Net "maxconnection" attribute se on the number of simultaneous connections allowed
        ' <system.net> 
        '   <connectionManagement> 
        '       <add address = "*" maxconnection = "10" /> 
        '   </connectionManagement> 
        ' </system.net> 

        ' resets data and arguments
        mlMDDownloadsToTo = UrlAndFileList.Count
        mlMDDownloadsDone = 0
        mlDownloadTotalSize = 0
        TotalSize = 0
        If mlMDDownloadsToTo = 0 Then Return 0       ' no file to download

        ' deletes previous files
        Dim p As KeyValuePair(Of String, String)
        For Each p In UrlAndFileList
            Try
                System.IO.File.Delete(p.Value)
            Catch ex As Exception
            End Try
        Next

        ' Download Files
        For Each p In UrlAndFileList
            Dim oSourceUri As New Uri(p.Key)
            Dim sSaveFile As String = p.Value

            Using wc As New System.Net.WebClient
                AddHandler wc.DownloadFileCompleted, AddressOf _wc_DownloadFileCompleted
                wc.DownloadFileAsync(oSourceUri, sSaveFile)
            End Using
        Next

        ' Wait for download
        While mlMDDownloadsToTo > 0
            System.Threading.Thread.Sleep(10)
        End While

        ' return
        TotalSize = mlDownloadTotalSize
        Return mlMDDownloadsDone
    End Function

    ''' <summary>
    ''' DownloadMultiple listener for "WebClient.DownloadFileCompleted" event
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub _wc_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
        Using wc As New System.Net.WebClient
            RemoveHandler wc.DownloadFileCompleted, AddressOf _wc_DownloadFileCompleted

            ' gets the downloaded file size from header
            Dim res As System.Net.WebClient = CType(sender, System.Net.WebClient)
            If Not IsNothing(res.ResponseHeaders) Then
                Dim sSize As String = res.ResponseHeaders("Content-Length").ToString().Trim()
                If IsNumeric(sSize) And sSize <> "" Then
                    Dim lSize As Int32 = CLng(sSize)
                    mlDownloadTotalSize += lSize
                End If
            End If
        End Using
        mlMDDownloadsToTo -= 1
        mlMDDownloadsDone += 1
    End Sub

Buon Divertimento!

Simone
Registrato

--------------------------------------------------
Incredibilmente esistono ancora persone che
proteggono i propri PC con password=pippo.
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines