tijote
Messages postés7Date d'inscriptionmercredi 12 mai 2010StatutMembreDernière intervention12 décembre 2013
-
Modifié par tijote le 10/12/2013 à 12:30
tijote
Messages postés7Date d'inscriptionmercredi 12 mai 2010StatutMembreDernière intervention12 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...
tijote
Messages postés7Date d'inscriptionmercredi 12 mai 2010StatutMembreDernière intervention12 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é
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
10 déc. 2013 à 13:03
à la lecture de : respStrm.Read(buffer, 0, 1024) le bytesread = 0
http://imabox.fr/a2/1310121301MxU26q25.png