VB.NET et FTP récalcitrant :(
Bonjour,
Je suis en train de me battre depuis plusieurs heures sur une application console qui doit communiquer avec un serveur FTP.
Le pitch : Je regarde dans un répertoire du FTP, je boucle sur tous les dossiers et pour chaque dossier je boucle sur tous les fichiers qu'il contient.
Avec mon serveur de test (perso) aucun souci, mais avec le serveur de prod gros problème : Environ 1 requête sur 2 provoque une erreur 501 (erreur de syntaxe dans les paramètres ou les arguments).
Je ne vois pas comment une erreur peut arriver si je change juste l'adresse du FTP. Pourquoi une requête sur deux alors que ce sont des méthodes qui génèrent mes requêtes ?
Voici à quoi ressemble le code :
Code:
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
| Public Sub grab()
'On récupère les numéros de fax
Dim File As String
Dim MyArray As Array = Nothing
Dim MyFiles As Array = Nothing
Dim MonClient As New PostAvenue.Client
Dim SQL As System.Data.SqlClient.SqlCommand
Dim RS As System.Data.SqlClient.SqlDataReader
Dim oConnectionInsert As System.Data.SqlClient.SqlConnection
'On parcoure les dossiers présents sur le FTP
oConnectionInsert = New System.Data.SqlClient.SqlConnection()
oConnectionInsert.ConnectionString = System.Configuration.ConfigurationSettings.AppSettings("POSTAVENUEConnectionString").ToString
oConnectionInsert.Open()
MyArray = listeDossiers("ftp://" & Client.Hostname & "/FAX_IN/", Client.Username, Client.Password)
For Each SDA As String In MyArray
'On ne prend pas les dossier '.' et '..'
If Not SDA.EndsWith(".") Then
MyFiles = listeFichiers("ftp://" & Client.Hostname & "/DOSSIER_IN/" & SDA & "/", Client.Username, Client.Password)
If Not (MyFiles Is Nothing) Then
SQL = oConnectionInsert.CreateCommand()
SQL.CommandText = "Select SDA_ClientID FROM TBL_SDA WHERE SDA_NoSDA='" & SDA & "'"
RS = SQL.ExecuteReader()
If RS.HasRows Then
RS.Read()
MonClient.getFromID(Integer.Parse(RS("SDA_ClientID").ToString))
RS.Close()
For Each File In MyFiles
'On traite le fichier
Console.Write("> Info: Copie du fichier " & File & ":")
downloadFichier("ftp://" & Client.Hostname & "/DOSSIER_IN/" & SDA & "/" & File, System.Environment.CurrentDirectory & "/tmp", Client.Username, Client.Password)
Console.WriteLine(" OK")
'On créer les dossiers si on en a besoin
Console.Write("> Info: Création des répertoires (" & MonClient.GUID & "):")
creerRepertoire("ftp://00.00.00.00/WEBSITE/clients/" & MonClient.GUID & "/in", "admin", "root")
Console.WriteLine(" OK")
'On l'upload, qu'il soit dispo sur le site.
Console.Write("> Info: Upload du fichier :")
uploadFichier(System.Environment.CurrentDirectory & "/tmp", "ftp://84.37.14.68/POSTAVENUE/SITE/clients/" & MonClient.GUID & "/in/" & File, "admin", "root")
Console.WriteLine(" OK")
Console.Write("> Info: Suppression du fichier temporaire :")
System.IO.File.Delete(System.Environment.CurrentDirectory & "/tmp")
Console.WriteLine(" OK")
Console.Write("> Info: Suppression du fichier distant :")
removeFichier("ftp://" & Client.Hostname & "/DOSSIER_IN/" & SDA & "/" & File, Client.Username, Client.Password)
Console.WriteLine(" OK")
Console.Write("> Info: Ajout des infos dans la base :")
Dim SQLInsert As System.Data.SqlClient.SqlCommand = oConnectionInsert.CreateCommand()
SQLInsert.CommandText = "INSERT INTO TBL_SDAIN (SDAIN_ClientID, SDAIN_Fichier, SDAIN_Emeteur) VALUES (" & MonClient.ID & ", '" & File & "', '123')"
If SQLInsert.ExecuteNonQuery() > 0 Then
Console.WriteLine(" OK")
Else
Console.WriteLine(" Echec")
End If
Console.WriteLine()
Next
Else
RS.Close()
Console.WriteLine("> Erreur: Impossible de trouver le client associé !")
End If
End If
Else
Console.WriteLine(".")
End If
Next
End Sub |
Et la methode ou à lieu l'erreur :
Code:
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
| Public Function listeFichiers(ByVal serveurCible As String, ByVal identifiant As String, ByVal motDePasse As String) As Array
Dim monResponseStream As Stream = Nothing
Dim monStreamReader As StreamReader = Nothing
Dim monResultat As Array = Nothing
' Instanciation de deux Uri qui vont contenir les chemins source et destination
Dim monUriServeur As New System.Uri(serveurCible)
' Vérification de la validité de l'Uri du fichier sur le serveur FTP
If Not (monUriServeur.Scheme = Uri.UriSchemeFtp) Then
'MessageBox.Show("L'Uri du serveur FTP n'est pas valide", "Une erreur est surevnue", MessageBoxButtons.OK, MessageBoxIcon.Warning)
'Si Uri non valide, arrêt du listage
Return monResultat
Exit Function
End If
Try
' Création de la requête de récupération de la liste des fichiers
Dim maRequeteListe As FtpWebRequest = CType(WebRequest.Create(monUriServeur), FtpWebRequest)
maRequeteListe.Method = WebRequestMethods.Ftp.ListDirectoryDetails
' 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)
maRequeteListe.Credentials = monCompteFtp
End If
'Console.WriteLine(maRequeteListe.GetRequestStream.ToString)
' Récupération de la liste de fichiers
Dim maResponseListe As FtpWebResponse = CType(maRequeteListe.GetResponse, FtpWebResponse)
' Placement du flux provenant du serveur dans un streamreader
monStreamReader = New StreamReader(maResponseListe.GetResponseStream, Encoding.Default)
' Lecture du stream reader
Dim listeBrute As String = monStreamReader.ReadToEnd
' Découpage de chaque fichier dans la liste concaténée de fichiers
Dim separateur() As String = {Environment.NewLine} ' -> retour chariot
' Découpage et récupération des noms de fichiers
Dim tableauListe() As String = listeBrute.Split(separateur, StringSplitOptions.RemoveEmptyEntries)
Dim listeFinale As New List(Of String)
' Lecture du tableau et tri des noms de fichiers
Dim i As Integer = 0
While i < tableauListe.Length
' Les répertoires se différencient des fichiers par le fait que
' la chaîne que l'on récupère commence par un "d".
If Not tableauListe(i).StartsWith("d") Then
' On place les noms de fichiers dans une liste
listeFinale.Add(tableauListe(i).Substring(tableauListe(i).LastIndexOf(" ") + 1))
End If
i += 1
End While
monResultat = listeFinale.ToArray
'MessageBox.Show("Liste terminée")
' Gestion des exceptions
Catch ex As Exception
Console.WriteLine(ex.Message)
Finally
' Fermeture des différents flux utilisés
If monResponseStream IsNot Nothing Then
monResponseStream.Close()
End If
If monStreamReader IsNot Nothing Then
monStreamReader.Close()
End If
End Try
Return monResultat
End Function |
Je suis tenté de dire que l'erreur vient du serveur, car le code fonctionne sen test, mais je ne suis pas sur... Quelqu'un pourrait m'éclairer ?
++
A