Bgw + progressbar + download [Résolu]

Messages postés
7
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
12 décembre 2013
-
Bonjour,

voici le code que j'utilise pour faire un downlaod


    
Public Function downloadFTP(ByVal Cheminfile As String, ByVal URL As String, ByVal bk As String, ByVal pw As String, ByVal Er As String) As String

Dim requ As FtpWebRequest = CType(WebRequest.Create(URL), FtpWebRequest)
requ.Credentials = New NetworkCredential(bk, pw)

requ.Method = WebRequestMethods.Ftp.DownloadFile
Dim resp As FtpWebResponse = CType(requ.GetResponse(), FtpWebResponse)

Dim respStrm As Stream = resp.GetResponseStream()
Dim filename As String = Path.GetFileName(requ.RequestUri.LocalPath)
Dim fileStrm As FileStream = File.Create(Cheminfile & "\" & filename)

Dim buff(1024) As Byte
Dim bytesread As Integer = 0

While (True)
Try
bytesread = respStrm.Read(buff, 0, buff.Length)
If (bytesread = 0) Then Exit While
fileStrm.Write(buff, 0, bytesread)

Catch ex As Exception
Er = ex.Message
If respStrm IsNot Nothing Then respStrm.Close()
If fileStrm IsNot Nothing Then fileStrm.Close()
Return Er
Exit Function
End Try
End While
respStrm.Close()
fileStrm.Close()
Er = "Download de "

Return Er

End Function


ce code fonctionne parfaitement donc je vais le coupler avec le backgroundworker afin de remplir une progressbar, quoi je vais essayer....

donc voilà

Dim Url As String = ""
Dim Cheminfile As String = ""
Dim Barmax As Integer

Private Sub Label4_Click(sender As Object, e As EventArgs) Handles Label4.Click
ProgressBar1.Value = 0
Url = "ftp://xx.xx.xxx.x/monfichier.txt"
Cheminfile = "C:\prog\"
Barmax = 0
bgwDown.RunWorkerAsync()
End Sub

Private Sub bgwDown_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgwDown.DoWork

Dim buffer(1024) As Byte
Dim bytesSoFar As Long = 0
Dim bytesread As Integer = 0

'1) 1ère requette pour la récupereration de la taille du fichier
Dim requ As FtpWebRequest = DirectCast(System.Net.FtpWebRequest.Create(Url), System.Net.FtpWebRequest)
requ.Credentials = New NetworkCredential(user, mdp)
requ.Method = WebRequestMethods.Ftp.GetFileSize
Dim ftpResponse As System.Net.FtpWebResponse = DirectCast(requ.GetResponse(), FtpWebResponse)
Barmax = CInt(ftpResponse.ContentLength / 1024)

Dim respStrm As Stream = ftpResponse.GetResponseStream()
bytesread = respStrm.Read(buffer, 0, 1024)
'respStrm.Close()

'2) 2ème requette pour la recuperation du fichier car sa plante sinon
requ = DirectCast(System.Net.FtpWebRequest.Create(Url), System.Net.FtpWebRequest)
requ.Credentials = New NetworkCredential(user, mdp)
requ.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
respStrm = ftpResponse.GetResponseStream()
bytesread = respStrm.Read(buffer, 0, 1024)
Dim filename As String = Path.GetFileName(requ.RequestUri.LocalPath)
Dim fileStrm As FileStream = File.Create(Cheminfile & "\" & filename)

bytesread = 1
Do Until bytesread < 1
bytesread = respStrm.Read(buffer, 0, 1024)
If bytesread > 0 Then
fileStrm.Write(buffer, 0, bytesread)
' increment progress bar (accounting for any inaccuracy in calculation)
bgwDown.ReportProgress((bytesread * 100) / Barmax, "Hébergement du fichier : " & New FileInfo(filename).Name)
End If
Loop

respStrm.Dispose()
fileStrm.Dispose()
End Sub

Private Sub BbgwDown_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwDown.ProgressChanged
If Not e.ProgressPercentage > 100 Then
ProgressBar1.Maximum = Barmax
ProgressBar1.Value = e.ProgressPercentage
End If
End Sub

Voilà en partie mon code je lance le traitement asynchrone par le biais d'un click, puis le dowork execute le traitement et le ProgressChangedEventArgs me rempli ma barre...

le problème c'est que le bytesread reste toujours a zero et du coup le telechargement ne fonctionne pas...

est ce que quelqu'un peu m'aider merci

Merci
Afficher la suite 

4 réponses

Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
26 décembre 2018
46
0
Merci
Salut

le bytesread reste toujours a zero

déclare Dim bytesread As Integer = 0 en dehors du Sub bgwDown_DoWork
tijote
Messages postés
7
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
12 décembre 2013
-
Ok je l'ai déclarer en dehors

à la lecture de : respStrm.Read(buffer, 0, 1024) le bytesread = 0

http://imabox.fr/a2/1310121301MxU26q25.png
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
26 décembre 2018
46
0
Merci
et les bytesread = respStrm.Read(buffer, 0, 1024)
au dessu > 0 ?
ligne 28 et ligne 36
tijote
Messages postés
7
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
12 décembre 2013
-
tijote
Messages postés
7
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
12 décembre 2013
-
j'ai un doute sur la méthodes de gestion des bytes
tijote
Messages postés
7
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
12 décembre 2013
-
tijote
Messages postés
7
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
12 décembre 2013
-
j'ai modifié mon code :


Private Sub bgwDown_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgwDown.DoWork

Dim bytesSoFar As Long = 0
Dim bytesread As Integer = 0

'1) 1ère requette pour la récupereration de la taille du fichier
Dim requ As FtpWebRequest = DirectCast(System.Net.FtpWebRequest.Create(Url), System.Net.FtpWebRequest)
requ.Credentials = New NetworkCredential(user, mdp)
requ.Method = WebRequestMethods.Ftp.GetFileSize
Dim ftpResponse As System.Net.FtpWebResponse = DirectCast(requ.GetResponse(), FtpWebResponse)
Barmax = CInt(ftpResponse.ContentLength / 1024) + 3

'2) 2ème requette pour la recuperation du fichier car sa plante sinon
requ = DirectCast(System.Net.FtpWebRequest.Create(Url), System.Net.FtpWebRequest)
requ.Credentials = New NetworkCredential(user, mdp)
requ.Method = System.Net.WebRequestMethods.Ftp.DownloadFile
ftpResponse = DirectCast(requ.GetResponse(), FtpWebResponse)
Dim respStrm As Stream = ftpResponse.GetResponseStream()
Dim filename As String = Path.GetFileName(requ.RequestUri.LocalPath)
Dim fileStrm As FileStream = File.Create(Cheminfile & "\" & filename)

bytesread = 1

Dim buffer(1023) As Byte
Do Until bytesread < 1
If bytesread > 0 Then
bytesread = respStrm.Read(buffer, 0, 1024)
fileStrm.Write(buffer, 0, bytesread)
bgwDown.ReportProgress(ProgressBar1.Value + 1)
End If
Loop

respStrm.Dispose()
fileStrm.Dispose()
End Sub

maintenant j'arrive a télécharger le fichier mais la barre n'affiche pas la réalité
Messages postés
3247
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
26 décembre 2018
46
0
Merci
Je ne vois pas
bgwDown.WorkerReportsProgress = True
Messages postés
7
Date d'inscription
mercredi 12 mai 2010
Statut
Membre
Dernière intervention
12 décembre 2013
0
Merci
voici j'ai trouvé:


Private Sub bgwDown_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgwDown.DoWork
Try

'récupération de la taille de la requête = taille du fichier puisque c'est ce que tu demandes !
Dim requ As FtpWebRequest = DirectCast(System.Net.FtpWebRequest.Create(Url), System.Net.FtpWebRequest)
requ.Credentials = New NetworkCredential(user, mdp)
requ.Method = WebRequestMethods.Ftp.GetFileSize
Dim ftpResponse As System.Net.FtpWebResponse = DirectCast(requ.GetResponse(), FtpWebResponse)
Dim fileLength As Long = ftpResponse.ContentLength

'Identification
Dim reqFTP As FtpWebRequest
reqFTP = DirectCast(FtpWebRequest.Create(New Uri(Url)), FtpWebRequest)
reqFTP.UseBinary = True
reqFTP.Credentials = New NetworkCredential(user, mdp)
'requête FTP.Méthode = DownloadFile
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile
Dim respons As FtpWebResponse = DirectCast(reqFTP.GetResponse(), FtpWebResponse)
Dim filename As String = Path.GetFileName(reqFTP.RequestUri.LocalPath)
'On travaille avec le flux
Using responseStream As IO.Stream = respons.GetResponseStream
' On créé un fichier pour réceptionné les données copiées ainsi on peut quantifier ce qui est recu
Using fs As New IO.FileStream(Cheminfile & "\fichier.txt", IO.FileMode.Create)
Dim buffer(2048) As Byte
Dim bytesread As Integer = 0
Dim bytesSoFar As Integer
Do
bytesread = responseStream.Read(buffer, 0, buffer.Length)
fs.Write(buffer, 0, bytesread)
bytesSoFar += bytesread
bgwDown.ReportProgress((bytesSoFar * 100) / fileLength, "Téléchargement du fichier : ")
Loop Until bytesread = 0
responseStream.Close()
fs.Flush()
fs.Close()
End Using
responseStream.Close()
End Using
Catch ex As Exception
MsgBox(ex.ToString)
End Try

End Sub