Bgw + progressbar + download [Résolu]

tijote
Messages postés
7
Date d'inscription
mercredi 12 mai 2010
Dernière intervention
12 décembre 2013
- 10 déc. 2013 à 12:29 - Dernière réponse : tijote
Messages postés
7
Date d'inscription
mercredi 12 mai 2010
Dernière intervention
12 décembre 2013
- 12 déc. 2013 à 08:57
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 

9 réponses

cs_ShayW
Messages postés
3238
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
14 mars 2018
- 10 déc. 2013 à 12:56
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
Dernière intervention
12 décembre 2013
- 10 déc. 2013 à 13:03
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
cs_ShayW
Messages postés
3238
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
14 mars 2018
- 10 déc. 2013 à 13:18
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
Dernière intervention
12 décembre 2013
- 10 déc. 2013 à 13:42
tijote
Messages postés
7
Date d'inscription
mercredi 12 mai 2010
Dernière intervention
12 décembre 2013
- 10 déc. 2013 à 13:45
j'ai un doute sur la méthodes de gestion des bytes
tijote
Messages postés
7
Date d'inscription
mercredi 12 mai 2010
Dernière intervention
12 décembre 2013
- 10 déc. 2013 à 14:07
tijote
Messages postés
7
Date d'inscription
mercredi 12 mai 2010
Dernière intervention
12 décembre 2013
- 11 déc. 2013 à 14:47
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é
cs_ShayW
Messages postés
3238
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
14 mars 2018
- Modifié par cs_ShayW le 11/12/2013 à 21:09
0
Merci
Je ne vois pas
bgwDown.WorkerReportsProgress = True
tijote
Messages postés
7
Date d'inscription
mercredi 12 mai 2010
Dernière intervention
12 décembre 2013
- Modifié par tijote le 12/12/2013 à 08:58
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

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.