Home > C#

Commandes FTP en C#

15. March 2010 by Lo�c.REBOURS

1 Présentation


1.1 Introduction

Le protocole FTP (File Transfer Protocol) est utilisé afin de permettre l'échange de fichiers sur un réseau. Principalement utilisé en tant que serveur de stockage personnel ou pour un site internet, le protocole FTP permet notamment d'uploader des fichiers présents en local sur votre serveur ou bien, à l'inverse, de récupérer des fichiers distants.


 

Evidemment, il existe de nombreux logiciels téléchargeables gratuitement qui permettent de gérer un serveur FTP, notamment FileZilla ou encore FTP Expert. Mais ces derniers sont souvent trop compliqués à utiliser pour des novices et parfois trop complet pour la simple utilisation que l'on veut en faire.

Votre chef de projet vient de vous confier le développement d'un gestionnaire de serveur FTP basé sur une application en C# mais vous ne savez pas comment vous y prendre ? Alors, vous vous trouvez au bon endroit.

A travers cet article, vous allez découvrir :

  • Les classes FTPWebRequest et FTPWebResponse
  • L'upload de fichiers distants
  • Le download de fichiers distants
  • Lister le contenu d'un répertoire
  • Récupérer la taille d'un fichier
  • Créer un répertoire, supprimer un répertoire, etc


1.2 La classe FTPWebRequest

Apporté par le framework .NET 2.0, la classe FTPWebRequest permet d'implémenter aisément un client FTP. Pour pouvoir utiliser cette classe, vous devez préalablement ajouter le namespace System.Net à votre projet.


 

Chaque objet de type FTPWebRequest créé pourra accomplir uniquement une action à la fois (upload, download, ...). La gestion des fichiers sur un serveur FTP ne se fait pas comme celle des fichiers en local.

Premièrement, voyons comment instancier notre objet de type FTPWebRequest.

 

 

Pour instancier notre objet, ici nommé myRequest, nous utilisons la méthode statique Create(). Cette dernière prend en paramètre soit un string, soit une URI (Uniform Ressource Identifier) correspondant à la ressource sur laquelle vous souhaitez agir.

La méthode Create() renvoie un objet de type WebRequest, d'où la nécessité de caster ce résultat en FtpWebRequest. WebRequest est une classe abstraite dont hérite FtpWebRequest.

Une fois instancié, plusieurs propriétés de notre objet doivent être valuées afin de définir notamment vos identifiants de connexion au serveur distant ainsi que les différentes options que vous souhaitez utiliser. Voyons ensemble les principales propriétés :

  • Credentials : de type NetworkCredential, cette propriété permet de spécifier votre login et password utilisé à la connexion au serveur FTP.
  • KeepAlive : Booléen permettant d'utiliser ou non la fonction keep-alive. Pour rappel, cette dernière permet d'utiliser une connexion persistante.
  • Method : String contenant l'action que nous allons faire sur notre ressource (download, création, upload,...). Les différentes actions sont récupérables via l'énumération WebRequestMethods.Ftp.
  • UseBinary : Booléen permettant de spécifier le type de données pour le transfert du fichier.
  • TimeOut : Entier contenant le temps d'attente pour une requête vers le serveur.

 

En vrac, on peut également nommer les propriétés Proxy, Headers, EnableSsl, AuthenticationLevel ou encore CachePolicy. En pratique, seules les propriétés Credentials et Method ont l'obligation d'être valuée pour effectuer une opération sur votre serveur.


 

Dans l'exemple ci-dessus, les identifiants toto/toto seront utilisés pour établir la connexion. Celle-ci n'utilisera pas keep-alive, sera utilisée pour télécharger un fichier, répondra après 1s et transférera ce fichier sous forme de fichier binaire.

Une fois ces différents paramètres renseignés, nous allons pouvoir envoyer la requête au serveur et récupérer la réponse via la méthode GetResponse(). Le résultat retourné sera de type WebResponse, dont dérive la classe FtpWebResponse que nous allons utiliser.

 

 

Cette réponse contient l'état de l'opération ainsi que l'ensemble des informations téléchargées à partir du serveur. A partir de notre objet response, il ne nous restera plus qu'à effectuer nos actions en fonction de l'opération soumise (écriture des données s'il s'agit d'un download par exemple).

Maintenant que vous possédez les connaissances nécessaires pour utiliser la classe FtpWebRequest, nous allons pouvoir entrer dans le vif du sujet. Dans la partie suivante, vous apprendrez à télécharger ainsi qu'uploader un fichier à partir d'un serveur distant.

 

2 Download et upload


2.1 Download d'un fichier

La plupart du temps, les opérations que vous aurez à faire sur un serveur FTP via votre application seront des opérations de download et d'upload. Commençons donc par ces dernières.

Pour que notre code soit propre, nous allons créer une classe nommée FTP qui sera utilisée tout au long de cet article. Cette classe sera composée de trois propriétés :

  • Server : string contenant le nom ou l'IP du serveur.
  • Username : string contenant le nom d'utilisateur nécessaire à la connexion.
  • Password : string contenant le mot de passe nécessaire à la connexion.

 

Cette classe regroupera également une méthode pour chaque opération (download, upload, etc). Pour nos besoins, il est nécessaire d'importer les espaces de nom System.Net ainsi que System.IO.


 

Commençons par le téléchargement d'un fichier. Pour cela, nous allons créer une première méthode, nommée Download(), qui prendra en paramètre un string correspondant  au répertoire contenant le fichier, ainsi que le nom du fichier que l'on souhaite télécharger. Pour simplifier notre code, nous oublierons volontairement les blocs try/catch durant tout cet article.

Voici le début de notre méthode comprenant l'instanciation de notre objet FtpWebRequest.


 

Première étape, la création d'un objet de type Uri indiquant l'endroit où se trouve la ressource que l'on souhaite télécharger. Celle-ci est composée du serveur, suivi du répertoire contenant le fichier, puis du fichier lui-même. La condition server.Uri != Uri.UriSchemeFtp permet simplement de vérifier que le format de notre URI est correct. Si ce n'est pas le cas, alors inutile de continuer l'opération.

La deuxième étape consiste à créer notre objet FtpWebRequest tel que nous l'avons expliqué dans la partie précédente. Nous renseignons ensuite les identifiants via nos variables locales et indiquons l'opération DownloadFile.

Prochaine étape, l'envoie de la requête et la récupération de la réponse.


 

Comme vu précédemment, la réponse est retournée via la méthode GetResponse() dans un objet de type FtpWebResponse.

Sur cet objet, nommé response, nous allons appeler la méthode GetResponseStream() qui va retourner un objet de type Stream correspond au flux de données récupéré sur le serveur FTP. Ce stream sera stocké dans un objet nommé responseStream.

Enfin, nous créons un objet de type FileStream nommé fs qui nous permettra d'écrire notre flux de données. Nous utilisons le constructeur pour créer notre fichier de réception, ici situé dans E:/ftp/ et dont le nom sera le même que celui du fichier téléchargé.

Dernière étape, il ne reste plus qu'à écrire nos données comme n'importe quel autre flux d'entrée/sortie. Pour optimiser la copie, nous utiliserons un buffer de 2Ko.


 

Après écriture des données dans notre fichier en local, fermez les différents flux ouverts et le tour est joué.

Voici la fonction en entière :


 

Voici maintenant un exemple d'utilisation de cette méthode.

 

 

Dans un premier temps, nous instancions un objet de type FTP en utilisant l'initialiseur pour valuer les propriétés Server, Username et Password, puis appelons la méthode Download() en spécifiant le chemin du fichier a télécharger. Ici, le fichier www/Test/index.php de notre serveur sera téléchargé, puis stocké localement dans le fichier E:/ftp/index.php.

Vous pouvez ainsi télécharger n'importe quel fichier situé sur votre FTP vers votre ordinateur en à peine quelques lignes de code.


2.2 Upload d'un fichier

Le fonctionnement pour l'upload d'un fichier est presque similaire, à la différence qu'au lieu de copier des données récupérées sur le serveur, nous allons les envoyer vers ce serveur. Pour ce faire, nous allons ajouter la méthode Upload() à notre classe FTP. Celle-ci prendra en paramètre un string indiquant l'emplacement du fichier sur le serveur et un deuxième spécifiant l'emplacement du fichier local à uploader.

Dans un premier temps, comme pour chaque opération, nous allons créer notre objet de type FtpWebRequest. Cette fois-ci, il faudra indiquer la méthode UploadFile.


 

Comme tout à l'heure, nous créons premièrement notre objet de type Uri, vérifions si son format est correct, puis instancions un objet de type FtpWebRequest en lui accordant cette fois-ci la méthode UploadFile.

La deuxième étape consiste, comme tout à l'heure, à charger le fichier dans un buffer.

 

 

En accordant à notre buffer la taille de notre fichier à uploader, nous allons écrire ce dernier en une seule opération. Cette méthode est efficace pour les petits fichiers, mais nous ne vous conseillons pas d'opérer ainsi avec des fichiers plus volumineux. Si c'est le cas, vous pouvez écrire votre fichier par partie de 2Ko comme effectué dans la partie précédente.

Dernière étape, il ne nous reste plus qu'à récupérer le flux utilisé pour l'upload du fichier via la méthode GetRequestStream() de notre objet FtpWebRequest, puis à écrire nos données.


 

Comme tout à l'heure, n'oubliez pas de fermer les différents streams ouverts et le tour est joué.

Voici la fonction complète, ainsi qu'un exemple d'utilisation.

 


Tout comme pour le téléchargement d'un fichier, vous êtes dorénavant capable d'uploader n'importe quel fichier en quelques lignes de code en spécifiant simplement le fichier à copier et l'emplacement de ce fichier sur le serveur. Dans notre cas, nous uploadons le fichier E:/toto.txt vers le fichier www/toto.txt sur notre serveur.

Dans la prochaine partie, nous apprendrons à gérer les répertoires se trouvant sur votre serveur, c'est-à-dire à les créer, les supprimer et les renommer.

 

3 Gestion des répertoires


3.1 Créer un répertoire

Si votre application doit permettre de gérer entièrement un serveur FTP, alors vous aurez forcément à travailler avec les répertoires. Si vous avez compris la partie précédente sur l'upload et le download, alors cette partie sera pour vous un jeu d'enfant.

Commençons par la création d'un répertoire. Pour cela, nous allons ajouter une méthode CreateDirectory() à notre classe FTP et qui prendra en paramètre un string indiquant l'emplacement du répertoire à créer.

Comme d'habitude, nous allons :

  • Créer un objet de type URI
  • Vérifier son format
  • Instancier notre objet de type FtpWebRequest

 

Cette fois-ci, la méthode à utiliser se nomme MakeDirectory.


 

La création d'un répertoire ne demandant aucune opération d'écriture de données manuellement, il nous suffit d'envoyer notre requête et de récupérer notre réponse pour créer le dossier.


 

La deuxième ligne de code correspond à l'affichage d'un texte décrivant le code de retour (StatusCode) de notre opération. Rappelez-vous, l'objet FtpWebResponse contient l'état de l'opération et/ou les données téléchargées.

Si le chemin indiqué est correct, vous obtiendrez le message suivant : "Status description : 257 "directory_path" - Directory successfully created".

Voici la méthode complète, suivi d'un exemple d'utilisation.


 

Dans notre exemple, nous créons un répertoire nommé "myNewDirectory" se situant dans le dossier www de notre serveur.  Si la création est confirmée, nous obtiendrons le message de confirmation expliqué ci-dessus.


3.2 Supprimer un répertoire

La suppression d'un répertoire se fait exactement de la même façon que sa création. Pour nos besoins, nous allons créer une méthode nommée RemoveDirectory() qui prendra en paramètre un string indiquant l'emplacement du répertoire à supprimer.

Le code à utiliser pour cette nouvelle méthode sera exactement la même que pour la méthode précédente. La seule et unique différence sera l'utilisation de la méthode RemoveDirectory à la place de MakeDirectory.

Voici donc, directement, le code complet de notre méthode, suivi d'un exemple d'utilisation.


 

Comme pour la création, nous affichons la description de notre opération grâce à la propriété StatusDescription. Si l'opération s'effectue comme souhaitée, le message renvoyé sera le suivant : "Status description : 250 RMD command succesfull".


3.3 Renommer un répertoire

Pour cette opération, nous allons créer une méthode nommée RenameDirectory() prenant en paramètre un string indiquant le nom du répertoire à modifier, ainsi qu'un second string spécifiant le nouveau nom du répertoire.

Encore une fois, l'opération sera quasiment identique aux précédentes. Néanmoins, il faudra utiliser la propriété RenameTo de notre objet FtpWebRequest. Celle-ci contiendra le nouveau nom de notre répertoire à renommer. Il faudra également changer le nom de la méthode utilisée qui, cette fois, s'appellera Rename.

Comme d'habitude, voici la méthode complète, suivi d'un exemple d'utilisation.


 

Comme vous le constatez, la propriété RenameTo de notre objet FtpWebRequest récupère la valeur de notre paramètre newName indiquant le nouveau nom du répertoire à renommer. Dans notre cas, une fois l'opération effectuée, nous obtiendrons le répertoire "www/newName".

Encore une fois, nous affichons la description de notre opération afin de vérifier que tout s'est bien déroulé. Si tel est le cas, vous devriez obtenir le message suivant : "Status description : 250 status successful".

Vous voilà dorénavant maître de vos répertoires. Dans la dernière partie de cet article, nous verrons comment supprimer un fichier, récupérer la taille d'un fichier et lister le contenu d'un répertoire.

 

4 Fichiers et conclusion


4.1 Supprimer un fichier

Dorénavant, vous savez gérer vos répertoires, uploader et récupérer des fichiers. Il ne vous reste plus qu'à savoir manipuler vos fichiers afin de pouvoir entièrement gérer votre serveur depuis votre application.

Commençons par la suppression d'un fichier. Pour cela, nous allons créer une méthode nommée DeleteFile qui prendra en paramètre un string indiquant l'emplacement du fichier à supprimer.

Cette méthode sera identique à celle utile à la suppression d'un répertoire, à la différence près que nous utiliserons ici la méthode DeleteFile à la place de RemoveDirectory.


 

Dans notre exemple, nous supprimons le fichier myFile.txt se situant dans le dossier www lui-même à la racine de notre serveur. Si l'opération se déroule correctement, le message suivant devrait s'afficher : "Status description : 250 DELE command successful".


4.2 Récupérer la taille d'un fichier

Pour récupérer la taille de notre fichier, nous allons créer une méthode nommée FileSize qui prendra en paramètre l'emplacement de notre fichier. Encore, une fois, le code sera quasiment le même que pour les méthodes précédentes, il faudra simplement utiliser la méthode GetFileSize.


 

Au moment de récupérer notre réponse, au lieu de créer un objet de type FtpWebResponse comme d'habitude, nous récupérons directement la taille du contenu qui correspond à la taille de notre fichier. Nous affichons par la suite ce dernier dans une boîte de dialogue.


4.3 Lister le contenu d'un répertoire

Avant de créer des fichiers ou répertoires, il est parfois utile de savoir ce qui se trouve sur notre FTP. Pour cela, le framework .NET met à notre disposition les méthodes ListDirectory et ListDirectoryDetails permettant d'obtenir le contenu d'un répertoire donné.

Ces deux méthodes s'utilisent exactement de la même façon, seul le nom change. Pour notre exemple, nous allons créer une méthode nommée ListDirectory() prenant en paramètre un string indiquant l'emplacement du répertoire dont on souhaite lister le contenu.

Dans notre cas, nous allons utiliser la méthode ListDirectoryDetails et afficher ce contenu dans un fichier. On pourrait parfaitement déclarer un tableau de string en paramètre de retour de cette méthode pour l'exploiter par la suite dans notre application afin de boucler sur chaque élément contenu dans le répertoire.

La réalisation de cette opération s'apparente plus ou moins à celle du téléchargement d'un fichier. Après avoir envoyé notre requête, nous récupérer les données et les écrivons dans notre fichier.


 

Dans notre exemple, nous stockons la réponse dans un string myFile, puis écrivons octet par octet la contenu de ce string dans notre fichier réponse, ici nommé list.txt.

Ce dernier comportera la liste détaillée du contenu du répertoire www. Le fichier contiendra, entre autres, les droits d'accès, les propriétaires du fichier, la taille, le nom, etc. Votre fichier devrait normalement ressembler a ceci :

drwxr-xr-x  22 Loïc   Loïc        4096 Feb 23 20:55 .

drwx---r-x  27 Loïc    Loïc        4096 Mar 14 12:53 ..

-rw-r--r--    1 Loïc    Loïc        5801 Feb 19 21:39 test.txt

En utilisant la méthode ListDirectory, seul les noms des fichiers et dossiers auraient été répertoriés.


4.4 Conclusion

Gérer un serveur FTP depuis une application peut s'avérer difficile à premier abord. Pourtant, le framework .NET nous offre depuis sa version 2.0 une façon simple et efficace de gérer nos fichiers et répertoires distants. Avec un minimum de connaissance du langage et un peu de travail, il devient rapidement très aisé de manipuler vos données.

Rappelons les différentes étapes nécessaires pour gérer votre FTP :

  • Créer un objet de type string ou URI contenant l'emplacement de la ressource sur laquelle vous souhaitez travailler.
  • Instancier un objet de type FtpWebRequest en lui passant en paramètre votre URI.
  • Valuer les différentes propriétés de votre objet tel que Credentials, KeepAlive ou encore TimeOut.
  • Choisissez une action à effectuer grâce à l'énumération WebRequestMethods.Ftp.
  • Récupérer votre réponse dans un objet de type FtpWebResponse.
  • Manipuler votre réponse (écriture dans un fichier, affichage de l'état de l'opération, etc) selon l'opération effectuée.

 

A travers cet article, nous vous avons fait découvrir diverses opérations telles que DownloadFile, MakeDirectory ou encore DeleteFile. Sachez qu'il en existe également d'autres que nous n'avons pas vues, notamment AppendFile, PrintWorkingDirectory et UploadFileWithUniqueName. Toutes ses méthodes peuvent être utilisées en suivant la marche à suivre énoncée ci-dessus.

Vous voilà dorénavant maître de votre serveur FTP.

C# ,

Add comment




  Country flag

biuquote
  • Comment
  • Preview
Loading

captcha

*