Bgw + progressbar + download

Résolu
tijote Messages postés 7 Date d'inscription mercredi 12 mai 2010 Statut Membre Dernière intervention 12 décembre 2013 - Modifié par tijote le 10/12/2013 à 12:30
tijote Messages postés 7 Date d'inscription mercredi 12 mai 2010 Statut Membre 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

4 réponses

cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
10 déc. 2013 à 12:56
Salut

le bytesread reste toujours a zero

déclare Dim bytesread As Integer = 0 en dehors du Sub bgwDown_DoWork
0
tijote Messages postés 7 Date d'inscription mercredi 12 mai 2010 Statut Membre 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
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
10 déc. 2013 à 13:18
et les bytesread = respStrm.Read(buffer, 0, 1024)
au dessu > 0 ?
ligne 28 et ligne 36
0
tijote Messages postés 7 Date d'inscription mercredi 12 mai 2010 Statut Membre Dernière intervention 12 décembre 2013
10 déc. 2013 à 13:42
0
tijote Messages postés 7 Date d'inscription mercredi 12 mai 2010 Statut Membre 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
0
tijote Messages postés 7 Date d'inscription mercredi 12 mai 2010 Statut Membre Dernière intervention 12 décembre 2013
10 déc. 2013 à 14:07
0
tijote Messages postés 7 Date d'inscription mercredi 12 mai 2010 Statut Membre 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é
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
Modifié par cs_ShayW le 11/12/2013 à 21:09
Je ne vois pas
bgwDown.WorkerReportsProgress = True
0
tijote Messages postés 7 Date d'inscription mercredi 12 mai 2010 Statut Membre Dernière intervention 12 décembre 2013
Modifié par tijote le 12/12/2013 à 08:58
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
0
Rejoignez-nous