1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
Imports System.IO
Imports System.Net
Imports System.Text
Public Class DownloadFTP
Shared Sub downloadFichier(ByVal strUrlFichier As String, _
ByVal strCheminDestinationFichier As String, _
ByVal identifiant As String, _
ByVal motDePasse As String)
' strUrlFichier : Uri du fichier sur le serveur FTP
' strCheminDestinationFichier : Uri du fichier sur le disque dur
' identifiant : login du compte FTP utilisé
' motDePasse : mot de passe du compte FTP utilisé
' Instanciation de deux Uri qui vont contenir les chemins source et destination
Dim monUriFichier As New System.Uri(strUrlFichier)
Dim monUriDestinationFichier As New System.Uri(strCheminDestinationFichier)
' Vérification de la validité de l'Uri du fichier sur le serveur FTP
If Not (monUriFichier.Scheme = Uri.UriSchemeFtp) Then
MessageBox.Show("L'Uri du fichier sur le serveur FTP n'est pas valide", _
"Une erreur est surevnue", MessageBoxButtons.OK, MessageBoxIcon.Warning)
' Si Uri non valide, arrêt du téléchargement
Exit Sub
End If
' Vérification de la validité de l'Uri de l'emplacement du fichier de destination
If Not (monUriDestinationFichier.Scheme = Uri.UriSchemeFile) Then
MessageBox.Show("Le chemin de destination n'est pas valide !", _
"Une erreur est surevnue", _
MessageBoxButtons.OK, MessageBoxIcon.Warning)
' Si Uri non valide, arrêt du téléchargement
Exit Sub
End If
' Création des 2 flux et du reader nécessaire pour la récupération du fichier
Dim monResponseStream As Stream = Nothing
Dim monFileStream As FileStream = Nothing
Dim monReader As StreamReader = Nothing
Try
' Requête demandant le fichier se trouvant sur le serveur FTP
Dim downloadRequest As FtpWebRequest = CType(WebRequest.Create(monUriFichier), FtpWebRequest)
' Vérification de la présence des identifiants d'un compte, si aucun alors
' la connexion se fait en mode anonyme
If Not identifiant.Length = 0 Then
Dim monCompteFtp As New NetworkCredential(identifiant, motDePasse)
downloadRequest.Credentials = monCompteFtp
End If
' Flux de données issu du fichier sur le serveur FTP
Dim downloadResponse As FtpWebResponse = CType(downloadRequest.GetResponse(), FtpWebResponse)
monResponseStream = downloadResponse.GetResponseStream()
' Chemin de destination du fichier sur le disque dur
Dim nomFichier As String = monUriDestinationFichier.LocalPath.ToString
' Création du fichier de destination sur le disque dur
monFileStream = File.Create(nomFichier)
' Tableau d'octets qui va contenir les données issues du flux
Dim monBuffer(1024) As Byte
Dim octetsLus As Integer
' Lecture du buffer, puis écriture des données dans le fichier
Dim stat As New FtpStatusCode
If Form1.RdoFTPS.Checked = True Then
downloadRequest.EnableSsl = True
End If
While (True)
System.Windows.Forms.Application.DoEvents()
If arret = True Then
MsgBox("Fin de la transaction")
octetsLus = 0
monBuffer = Nothing
downloadResponse.Close()
monFileStream.Close()
monResponseStream.Close()
downloadRequest = Nothing
monResponseStream.Dispose()
Exit Sub
End If
' Lecture du flux
octetsLus = monResponseStream.Read(monBuffer, 0, monBuffer.Length)
Form1.ProgressBar1.Step = octetsLus
Form1.ProgressBar1.Maximum = Form1.Grd1.Item(2, (Form1.Grd1.CurrentRow.Index)).Value.ToString
Form1.ProgressBar1.PerformStep()
If octetsLus = 0 Then
Exit While
End If
' Ecriture dans le fichier
monFileStream.Write(monBuffer, 0, octetsLus)
End While
MessageBox.Show("Téléchargement effectué.")
' Gestion des exceptions
Catch ex As UriFormatException
Form1.RichTextBox1.Text = Form1.RichTextBox1.Text & ex.Message & vbCrLf
Catch ex As WebException
Form1.RichTextBox1.Text = Form1.RichTextBox1.Text & ex.Message & vbCrLf
Catch ex As IOException
Form1.RichTextBox1.Text = Form1.RichTextBox1.Text & ex.Message & vbCrLf
Finally
If arret = True Then
Form1.RichTextBox1.Text = Form1.RichTextBox1.Text & "Arrêt du transfert effectué" & vbCrLf
Form1.ProgressBar1.Value = 0
Else
' Fermeture du reader et des deux streams si nécessaire
If monReader IsNot Nothing Then
monReader.Close()
ElseIf monResponseStream IsNot Nothing Then
monResponseStream.Close() '<-------- erreur ici
End If
' Fermeture du flux et du fichier
If monFileStream IsNot Nothing Then
monFileStream.Close()
End If
End If
End Try
Form1.ProgressBar1.Value = 0
End Sub
End Class |
Partager