Hello le monde.
Voila une évolution de la classe que j'avais ecrit pour vb2002/2003 (présente sur le site).
Celle ci gère (heuresement) tout ce que fesait l'ancienne : resume, progression, proxy
Et les nouveautés :
_C'est maintenant une "vraie" classe
_Gestion de l'authentification type htaccess
_Gestion événement permettant des accés "thread-safe" aux controles des forms (le problème ne se posait pas en 2003, du moins aucunes exception n'était levée)
_Gestion d'erreures (simplistes, mais présente)
_Gestion des fichiers dont la taille n'est pas renvoyé par le header
Pourquoi n'ai je pas simplement fait une mise à jour du code exisant?
_Le sample accompagnant la classe a du être modifié, l'ancien n'est pas compatible avec cette nouvelle classe
_Les backgroundworker utilisé pour les renvoit d'évenement n'existent pas avant .Net 2.0
_La classe a été completement réecrite proprement
_L'ancienne classe marche très bien sous vb2002/2003
Cependant, si un admin juge qu'une simple mise à jour aurait suffit, la suppression de cette source ne me vexera pas ^^
Source / Exemple :
Option Strict On
Imports System.Net
Public Class HBDownloader2005
#Region "évenements"
Public Event download_Started(ByVal sender As Object, ByVal totalfilelen As Long, ByVal resumepos As Long, ByVal TimeTickStart As Long)
Public Event download_Progress(ByVal sender As Object, ByVal CurPosition As Long, ByVal CurPercentage As Integer)
Public Event download_Ended(ByVal sender As Object, ByVal EndPosition As Long, ByVal CurPercentage As Integer)
Public Event download_Error(ByVal sender As Object, ByVal ex As Exception)
#End Region
#Region "attributs"
Private b As Boolean
Private WithEvents bgw As System.ComponentModel.BackgroundWorker
Private BufSize As Integer = 32768
Private BytesArr(BufSize) As Byte
Private CurPos As Long
Private FileLength As Long
Private Hwebrequest As HttpWebRequest
Private IsResume As Boolean
Private ReadStream As IO.Stream
Private ResumePos As Long
Private StartTime As DateTime
Private TargetPath As String
Private FileUrl As String
#End Region
#Region "proprietés"
Public Property BufferSize() As Integer
Get
Return BufSize
End Get
Set(ByVal value As Integer)
BufSize = value
Array.Resize(BytesArr, BufSize)
End Set
End Property
Public ReadOnly Property Start_Time() As Date
Get
Return StartTime
End Get
End Property
Public ReadOnly Property Start_Tick() As Long
Get
Return StartTime.Ticks
End Get
End Property
#End Region
#Region "méthodes"
Public Sub Start(ByVal pathstr As String, ByVal strurl As String, ByVal bresume As Boolean)
Start(pathstr, strurl, IsResume, "", "", Nothing, Nothing)
End Sub
Public Sub Start(ByVal pathstr As String, ByVal strurl As String, ByVal bresume As Boolean, ByVal login As String, ByVal pass As String)
Start(pathstr, strurl, IsResume, login, pass, Nothing, Nothing)
End Sub
Public Sub Start(ByVal pathstr As String, ByVal strurl As String, ByVal bresume As Boolean, ByVal proxy As String, ByVal proxyport As Integer)
Start(pathstr, strurl, IsResume, "", "", proxy, proxyport)
End Sub
Public Sub Start(ByVal pathstr As String, ByVal strurl As String, ByVal bresume As Boolean, ByVal login As String, ByVal pass As String, ByVal proxy As String, ByVal proxyport As Integer)
b = True
IsResume = bresume
StartTime = Now
TargetPath = pathstr
FileUrl = strurl
Open_request(strurl, pathstr, login, pass, proxy, proxyport)
End Sub
Public Sub Stop_Download()
b = False
End Sub
Private Sub Open_request(ByVal fileurl As String, ByVal filepath As String, ByVal login As String, ByVal pass As String, ByVal proxy As String, ByVal proxyport As Integer)
Try
If proxy <> "" Then
Dim hproxy As WebProxy
hproxy = New WebProxy(proxy, proxyport)
WebRequest.DefaultWebProxy = hproxy
End If
Hwebrequest = CType(System.Net.HttpWebRequest.Create(fileurl), System.Net.HttpWebRequest)
If login <> "" Then
Dim hcredential As New System.Net.NetworkCredential(login, pass)
Hwebrequest.Credentials = hcredential
End If
If IsResume = True Then
ResumePos = FileLen(filepath)
CurPos = ResumePos
Hwebrequest.AddRange(CInt(CurPos))
End If
Dim hwebresponse As System.Net.HttpWebResponse = CType(Hwebrequest.GetResponse, System.Net.HttpWebResponse)
ReadStream = hwebresponse.GetResponseStream
FileLength = hwebresponse.ContentLength + CurPos
StartTime = Now
RaiseEvent download_Started(Me, FileLength, ResumePos, StartTime.Ticks)
bgw = New System.ComponentModel.BackgroundWorker
bgw.WorkerReportsProgress = True
bgw.RunWorkerAsync()
Catch ex As Exception
RaiseEvent download_Error(Me, ex)
End Try
End Sub
Private Function Get_Percentage(ByVal tmppos As Long, ByVal totallen As Long) As Integer
Dim tmpres As Long
If totallen > 0 Then
tmpres = CLng((tmppos / totallen) * 100)
Else 'si la taille du fichier n'était pas connue
tmpres = -1
End If
Return CInt(tmpres)
End Function
Private Sub Get_file(ByVal filepath As String)
Try
Dim tmplen As Integer
b = True
Do
tmplen = ReadStream.Read(BytesArr, 0, BufSize)
CurPos += tmplen
Dim filesave As New IO.FileStream(filepath, IO.FileMode.Append, IO.FileAccess.Write)
filesave.Write(BytesArr, 0, tmplen)
filesave.Close()
bgw.ReportProgress(Get_Percentage(CurPos, FileLength))
System.Threading.Thread.Sleep(1)
Loop While (tmplen > 0 And b = True)
b = False
ReadStream.Close()
Catch ex As Exception
RaiseEvent download_Error(Me, ex)
End Try
End Sub
Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
Get_file(TargetPath)
End Sub
Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged
RaiseEvent download_Progress(Me, CurPos, e.ProgressPercentage)
End Sub
Private Sub bgw_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted
RaiseEvent download_Ended(Me, CurPos, Get_Percentage(CurPos, FileLength))
End Sub
#End Region
End Class
Conclusion :
Commentaires? :)
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.