Téléchargement de fichier avec toutes les infos depuis un module en 100 lignes

Contenu du snippet

Bon voilà,
Dans le cadre d'un projet de 2 ans toujours en cours, voilà que j'avais besoin de télécharger facilement sans ocx (c'est enervant dans Vb2005 surtout que c'est destiné à disparaître alors dans mon projet, pff, puis faut les installer, bref!!), sans classe mais juste une fonction et des valeurs.
Vous indiquez le lien, l'emplacement et c'est parti! Ensuite vous pouvez récupérer les infos tel que l'avancement, les octets lus, la taille, etc
Vous pouvez modifier le nombre d'octets à lire à la fois et suivant la puissace de votre Pc, le téléchargement ira plus ou moins vite.
Une fonction est incluse pour vous aider à convertir le nombre d'octets en Ko, Mo, Go etc.
La pause et l'arret son inclus aussi
Pour eviter à votre application de mal tourner, le téléchargement se fait dans un thread.

Source / Exemple :


Option Strict On
Module ModDown
    Private DUrl As String 'Url sauvegardée
    Private DPath As String 'Path sauvegardé

    Public WBytesALire As Long = CLng((1024 * 1024) / 2) 'Nombre d'octets à lire à la fois, peut être modifiée avant le téléchargement
    Public DPause As Boolean 'Mettre en pause, peut être modifée n'importe quand
    Public DStopper As Boolean 'Arreter, peut être modifée n'importe quand

    Private BytesLus As Long 'Nombre d'octets lus (ne peut pas être modifiée et lu à l'exterieur)
    Private BytesLenght As Long 'Nombre d'octets total (ne peut pas être modifiée et lu à l'exterieur), l'avancement ce fait de cette manière RBytesLus / RBytesLenght *100
    Private BytesSecondes As Long 'Octets lu à la seconde, c'est la vitesse (ne peut pas être modifiée et lu à l'exterieur)
    Private BytesALire As Long 'Voir plus haut à WBytesALire (ne peut pas être modifiée et lu à l'exterieur)
    Private AncienBytesSecondes As Long 'Sert pour calculer la vitesse 'Voir plus haut à WBytesALire (ne peut pas être modifiée et lu à l'exterieur)

    Public RBytesLus As Long 'Voir à BytesLus (peut être lu, modifier ne servirait à rien car automatiquement remis à jour)
    Public RBytesLenght As Long 'Voir à BytesLenght (peut être lu, modifier ne servirait à rien car automatiquement remis à jour)
    Public RBytesSecondes As Long 'Voir à BytesSecondes (peut être lu, modifier ne servirait à rien car automatiquement remis à jour)

    Private WithEvents DTimer As New Windows.Forms.Timer 'Controle Timer servant pour calculer la vitesse
    Private NewThread As Threading.Thread 'Thread

    Public Sub DownloadFile(ByVal Url As String, ByVal Path As String)
        'Procédure de démmarage à appeler pour commencer le téléchargement
        DUrl = Url
        DPath = Path
        ResumeValeurs() 'Initialisation des valeurs
        NewThread = New System.Threading.Thread(AddressOf Thread_Launch) 'Déclencher le thread avec la fonction
        NewThread.Start() 'Go!
    End Sub

    Private Sub Thread_Launch()
        Get_file(DUrl, DPath) 'Appelle à la procédure de téléchargement
    End Sub
    Private Sub ValeursMaj()
        'Pour éviter le conflits les valeurs sensibles sont en privates, mais pour les lire on les envoit dans des variables publics
        RBytesLus = BytesLus
        RBytesLenght = BytesLenght
        RBytesSecondes = BytesSecondes
    End Sub
    Private Sub ResumeValeurs()
        'Initialisation des valeurs
        BytesLus = 0 'On a rien lu pour l'instant
        BytesALire = WBytesALire 'On met la valeur public en dans une variable private pour plus y toucher ^^
        DPause = False 'Pause = off
        DStopper = False 'Non, on veux pas arreter le téléchargement dès de début!
        DTimer.Interval = 1000 '1 sec pour ceux qui save 1000ms = 1sec
        DTimer.Enabled = True 'On enclenche le timer
    End Sub
    Private Sub DTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles DTimer.Tick
        'Ca speed ou pas ?
        BytesSecondes = BytesLus - AncienBytesSecondes 'Difference entre la derniere fois et maintenant depuis 1 sec
        AncienBytesSecondes = BytesLus 'La nouvelle valeur est sauvegardé pour la prochainne seconde
    End Sub

    Private Sub Get_file(ByVal Url As String, ByVal Path As String)
        Try 'Au cas où...
            Dim Wr As System.Net.WebRequest = System.Net.WebRequest.Create(Url) 'Nouvelle déclaration de requete http
            Dim Wre As System.Net.WebResponse = Wr.GetResponse 'Nouvelle déclaration de réponse http
            Dim ReadStream As IO.Stream 'Lire un stream
            Dim LengthSTream As Long 'Longueur du stream
            ReadStream = Wre.GetResponseStream 'On dit quel est le stream à lire...
            LengthSTream = Wre.ContentLength '...et quel est sa longueur...

            BytesLenght = LengthSTream '...qu'on sauve dans une variable private

            If BytesALire > BytesLenght Then BytesALire = BytesLenght 'Pour pas lire plus que ce qu'on demande (si le fichier est plus petit que le nombre d'octets à lire à la fois)

            Dim TempLength As Integer = 1 'On va dire que c'est 1 pour commencer la boucle
            Dim Bytes(CInt(BytesALire)) As Byte 'Tableaux qui contient les valeurs des octets

            Do While TempLength > 0 'Allez, hop, boucle qui parcours le stream
                TempLength = ReadStream.Read(Bytes, 0, Bytes.Length) 'On lit le stream petit à petit, octet par octet
                BytesLus += TempLength 'On informe l'utilisateur de ce qu'oon à lu
                Dim FileSave As New IO.FileStream(Path, IO.FileMode.Append, IO.FileAccess.Write) 'Declaration de sauvegarde
                FileSave.Write(Bytes, 0, TempLength) 'On sauve tout ca à la suite
                FileSave.Close() 'On ferme le fichier pour l'instant
                System.Threading.Thread.Sleep(1) 'Repos pour le pc, 1 ms ca lui suffit
                Do While DPause = True 'Si ya une pause on lui fait faire une boucle à l'infini sans faire ramer le pc
                    Application.DoEvents() 'Pour eviter que ca rame, on laisse l'action à la suite
                Loop
                ValeursMaj() 'On met à jour les valeurs privates dans les variables publics pour que l'utilisateur puisse lire
                If DStopper = True Then NewThread.Abort() 'Si on veut arreter on ferme le thread, attention le fichier reste sur le disque mais est incomplet, a vous de le supprimer 
            Loop 'Suite du stream
            ReadStream.Close() 'On ferme le lecteur de stream
        Catch exep As Exception 'Ca c'est s'il y a une alerte
            Msgbox2("Erreur : " & vbCrLf & exep.Message, 1, 1, "Erreur") 'Petit message technique
        End Try
    End Sub
    Public Function ConvertirBytes(ByVal Bytes As Long, Optional ByVal Decimals As Integer = 0) As String
        'Pour vous, une petite fonction courante pour convertir ces millions d'octets en valeurs plus compréhensibles
        Select Case Bytes
            Case Is < 1024
                Return Math.Round(CDbl(Bytes), Decimals) & " octets"
            Case Is < CLng((1024 ^ 2))
                Return Math.Round(CDbl(Bytes / CLng((1024 ^ 1))), Decimals) & " Ko"
            Case Is < CLng((1024 ^ 3))
                Return Math.Round(CDbl(Bytes / CLng((1024 ^ 2))), Decimals) & " Mo"
            Case Is < CLng((1024 ^ 4))
                Return Math.Round(CDbl(Bytes / CLng((1024 ^ 3))), Decimals) & " Go"
            Case Else
                Return "Inconnu"
        End Select
    End Function

End Module

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.