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
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.