Bgw + progressbar + download [Résolu]

tijote 7 Messages postés mercredi 12 mai 2010Date d'inscription 12 décembre 2013 Dernière intervention - 10 déc. 2013 à 12:29 - Dernière réponse : tijote 7 Messages postés mercredi 12 mai 2010Date d'inscription 12 décembre 2013 Dernière intervention
- 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 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 10 déc. 2013 à 12:56
0
Utile
Salut

le bytesread reste toujours a zero

déclare Dim bytesread As Integer = 0 en dehors du Sub bgwDown_DoWork
tijote 7 Messages postés mercredi 12 mai 2010Date d'inscription 12 décembre 2013 Dernière intervention - 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 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 10 déc. 2013 à 13:18
0
Utile
et les bytesread = respStrm.Read(buffer, 0, 1024)
au dessu > 0 ?
ligne 28 et ligne 36
tijote 7 Messages postés mercredi 12 mai 2010Date d'inscription 12 décembre 2013 Dernière intervention - 10 déc. 2013 à 13:42
tijote 7 Messages postés mercredi 12 mai 2010Date d'inscription 12 décembre 2013 Dernière intervention - 10 déc. 2013 à 13:45
j'ai un doute sur la méthodes de gestion des bytes
tijote 7 Messages postés mercredi 12 mai 2010Date d'inscription 12 décembre 2013 Dernière intervention - 10 déc. 2013 à 14:07
tijote 7 Messages postés mercredi 12 mai 2010Date d'inscription 12 décembre 2013 Dernière intervention - 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 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - Modifié par cs_ShayW le 11/12/2013 à 21:09
0
Utile
Je ne vois pas
bgwDown.WorkerReportsProgress = True
tijote 7 Messages postés mercredi 12 mai 2010Date d'inscription 12 décembre 2013 Dernière intervention - Modifié par tijote le 12/12/2013 à 08:58
0
Utile
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.