Ludovic ROLAND

Blog technique sur mes expériences de développeur.

Intéragir avec un serveur FTP en Perl 5 (3/6) : Naviguer dans les dossiers

11 août 2022

Au cours de ce chapitre, nous allons voir comment sont organisés les fichiers et les dossiers sur un serveur FTP, avant de nous intéresser à différentes commandes qui nous permettront de :

  • savoir où l’on est sur le serveur ;
  • lister les fichiers et les dossiers ;
  • se déplacer sur le serveur FTP.

Plan

pwd() : savoir où l’on est

Lorsqu’on est sur un serveur FTP, il est parfois nécessaire de connaître l’endroit où l’on se trouve par rapport à la racine.

Pour cela, nous allons utiliser la méthode pwd() de l’objet Net::FTP. Cette méthode retourne alors le chemin complet du dossier courant.

Pour information, pwd est l’acronyme de Present Working Directory.

Voyons tout de suite un exemple :

print $ftp->pwd();

Vous venez de vous connecter et que vous vous n’êtes pas déplacé sur le serveur, vous devriez avoir ceci qui s’affiche à l’écran :

/

Le / signifie que vous êtes à la racine du serveur FTP. Pour les utilisateurs de Linux, vous n’aurez certainement pas de mal à comprendre. Pour les utilisateurs de Windows, c’est comme si vous étiez à l’emplacement C:.

Si par exemple vous vous étiez déplacés dans le serveur, voici une exemple d’affichage que vous auriez pu avoir :

/img/all

Dans cet exemple, nous somme dans le répertoire all qui est lui même un répertoire de img se trouvant à la racine.

J’espère avoir été assez clair !

Il n’y a rien de plus à connaitre sur cette commande. Nous allons donc pouvoir passer à la suite.

ls() et dir() : lister les fichiers et dossiers

Lorsque l’on est sur un serveur FTP, il peut parfois être utile de connaître la liste des répertoires et des fichiers du dossier courant, où de n’importe quel dossier.

ls() : lister au format court

Cette méthode prend pour paramètre le chemin (relatif ou absolu) du dossier dont on souhaite lister le contenu. A noter que sans paramètre, cette fonction liste le contenu du répertoire courant.

Cette fonction retourne alors une référence vers un tableau dont chaque ligne représente un dossier ou un fichier du répertoire sur lequel on a exécuté la commande.

Voyons tout de suite un exemple :

my $ls = $ftp->ls()
  or warn $ftp->message; 

print 'Il y a '.@$ls.' élément(s) dans le dossier.'."\n"; 

foreach my $elt (@$ls) {
    print $elt."\n";
}
Il y a 28 élément(s) dans le dossier.
.
..
logs
lightbox.css
style.css
style_admin.css
admin_connexion.php
admin_deconnexion.php
admin_index.php
captcha.php
contact.php
index.php
ks.php
monofont.ttf
controleur
img
js
modele
vue
.htaccess
design_sjuk
liens.php
admin_autres.php
autres.php
facebook
tc.php
admin_tc.php
design_sjuk_v3.0

Une fois de plus, les utilisateurs de Linux ne seront pas perturbés. Pour les utilisateurs de Windows, j’aimerais revenir sur les dossier . et ...

Le dossier . représente en fait le dossier actuel, alors que le dossier .. représente le dossier parent au dossier ..

A noter que les mots clef or warn permettent de gérer les éventuelles exceptions sans quitter le programme. En effet, si ici l’utilisateur souhaite lister le contenu d’un répertoire qui n’existe pas, ce n’est pas une erreur critique, le programme peut continuer à fonctionner. Cependant, il conviendra de prévenir l’utilisateur de sa mauvaise manipulation.

Voyons maintenant un autre exemple où l’on passe une paramètre à notre fonction :

my $ls = $ftp->ls('/img/all')
  or warn $ftp->message; 

print 'Il y a '.@$ls.' élément(s) dans le dossier.'."\n"; 

foreach my $elt (@$ls) {
    print $elt."\n";
}

Voici alors ce que j’obtiens :

Il y a 13 élément(s) dans le dossier.
/img/all/.
/img/all/..
/img/all/ajouter.png
/img/all/bg_body.jpg
/img/all/bg_corps.jpg
/img/all/bg_menu.jpg
/img/all/bg_menu_hover.jpg
/img/all/editer.png
/img/all/header.jpg
/img/all/header_admin.jpg
/img/all/recherche.png
/img/all/supprimer.png
/img/all/Thumbs.db

dir() : lister au format long

Cette méthode prend pour paramètre le chemin (relatif ou absolu) du dossier dont on souhaite lister le contenu. A noter que sans paramètre, cette fonction liste le contenu du répertoire courant.

Cette fonction retourne alors une référence vers un tableau dont chaque ligne représente un dossier ou un fichier du répertoire sur lequel on a exécuté la commande.

Contrairement à la fonction ls() qui ne donne que le nom des éléments, la fonction dir() nous renvoie un nombre important d’informations.

Voyons tout de suite un exemple :

my $dir = $ftp->dir()
  or warn $ftp->message; 

print 'Il y a '.@$dir.' élément(s) dans le dossier.'."\n"; 

foreach my $elt (@$dir) {
    print $elt."\n";
}
Il y a 28 élément(s) dans le dossier.
drwx---r-t  11 u**** ftpusers     4096 Feb  6 17:08 .
drwx---r-t  11 u**** ftpusers     4096 Feb  6 17:08 ..
-rw-r--r--   1 u**** ftpusers       24 Sep  5 22:15 .htaccess
-rw-r--r--   1 u**** ftpusers     3194 Nov  6 12:08 admin_autres.php
-rw-r--r--   1 u**** ftpusers      122 Sep  5 21:03 admin_connexion.php
-rw-r--r--   1 u**** ftpusers      124 Sep  5 21:03 admin_deconnexion.php
-rw-r--r--   1 u**** ftpusers      241 Sep  5 21:03 admin_index.php
-rw-r--r--   1 u**** ftpusers      714 Sep 18 18:06 admin_tc.php
-rw-r--r--   1 u**** ftpusers     1049 Nov  6 12:08 autres.php
-rw-r--r--   1 u**** ftpusers     2979 Sep  5 21:03 captcha.php
-rw-r--r--   1 u**** ftpusers      226 Sep  5 21:03 contact.php
drwxr-xr-x   4 u**** ftpusers       31 Sep  5 21:03 controleur
drwxr-xr-x   2 u**** ftpusers     4096 Feb  6 17:09 design_sjuk
drwxr-xr-x   2 u**** ftpusers     4096 Jan 16 16:11 design_sjuk_v3.0
drwxr-xr-x   3 u**** ftpusers       51 Sep 13 22:31 facebook
drwxr-xr-x  13 u**** ftpusers      139 Nov  6 12:06 img
-rw-r--r--   1 u**** ftpusers      106 Sep  5 21:03 index.php
drwxr-xr-x   8 u**** ftpusers       79 Oct 14 21:00 js
-rw-r--r--   1 u**** ftpusers      169 Sep  5 21:03 ks.php
-rw-r--r--   1 u**** ftpusers      105 Sep 11 12:17 liens.php
-rw-r--r--   1 u**** ftpusers     1654 Sep  5 21:03 lightbox.css
drwxr-xr-x   3 u**** root         4096 Feb  7 13:32 logs
drwxr-xr-x   4 u**** ftpusers       57 Sep  5 21:11 modele
-rw-r--r--   1 u**** ftpusers    15560 Sep  5 21:03 monofont.ttf
-rw-r--r--   1 u**** ftpusers     3396 Sep  5 21:03 style.css
-rw-r--r--   1 u**** ftpusers     3322 Sep  5 21:03 style_admin.css
-rw-r--r--   1 u**** ftpusers      426 Sep 18 18:02 tc.php
drwxr-xr-x   4 u**** ftpusers       31 Sep  5 21:11 vue

Une fois de plus, les utilisateurs de Linux ne seront pas perturbés par toute ces informations. Pour les autres, voici quelques explications.

Considérons les lignes suivantes :

1 : les droits

Le champs 1 représente les droits d’accès du fichier ainsi que son type (fichier, dossier, lien)

2 : le nombre de liens physique

Dans le cas d’un fichier, ce nombre sera toujours à 1.

Dans le cas d’un dossier, il s’agit en fait du nombre de fichiers et dossiers qu’il contient.

3 : l’utilisateur propriétaire du fichier

Ce champs nous permet de connaître l’utilisateur qui est le propriétaire du fichier.

4 : le groupe propriétaire du fichier

Ce champs nous permet de connaître groupe qui propriétaire du fichier.

5 : la taille du fichier

Ce champs nous permet de connaître la taille du fichier en octet.

6 : date et heure de dernière modification

Ce champs nous permet de connaître la date ainsi que l’heure de dernière modification du fichier.

7 : nom du fichier

Finalement, ce dernier champs nous permet de connaître le nom du fichier.

Voyons maintenant un autre exemple où l’on passe une paramètre à notre fonction :

my $dir = $ftp->dir('/img/all')
  or warn $ftp->message; 

print 'Il y a '.@$dir.' élément(s) dans le dossier.'."\n"; 

foreach my $elt (@$dir) {
    print $elt."\n";
}

Voici alors ce que j’obtiens :

Il y a 13 élément(s) dans le dossier.
drwxr-xr-x   2 u**** ftpusers     4096 Sep  5 21:03 .
drwxr-xr-x  13 u**** ftpusers      139 Nov  6 12:06 ..
-rw-r--r--   1 u**** ftpusers    22016 Sep  5 21:03 Thumbs.db
-rw-r--r--   1 u**** ftpusers     4033 Sep  5 21:03 ajouter.png
-rw-r--r--   1 u**** ftpusers     1912 Sep  5 21:03 bg_body.jpg
-rw-r--r--   1 u**** ftpusers     1544 Sep  5 21:03 bg_corps.jpg
-rw-r--r--   1 u**** ftpusers     1538 Sep  5 21:03 bg_menu.jpg
-rw-r--r--   1 u**** ftpusers     1543 Sep  5 21:03 bg_menu_hover.jpg
-rw-r--r--   1 u**** ftpusers    10414 Sep  5 21:03 editer.png
-rw-r--r--   1 u**** ftpusers    34404 Sep  5 21:03 header.jpg
-rw-r--r--   1 u**** ftpusers    84565 Sep  5 21:03 header_admin.jpg
-rw-r--r--   1 u**** ftpusers     9078 Sep  5 21:03 recherche.png
-rw-r--r--   1 u**** ftpusers     8202 Sep  5 21:03 supprimer.png

cwd() et cdup() : changer de dossier

Bien évidemment, lorsque l’on est sur un serveur FTP, il peut-être utile de se déplacer, de changer de dossier. C’est ce que nous allons voir au cours de cette dernière partie.

cwd() : changer de dossier

Cette méthode prend pour paramètre le chemin (relatif ou absolu) du dossier auquel on souhaite accéder. A noter que sans paramètre, cette fonction nous déplace à la racine de notre serveur FTP.

Voyons tout de suite un exemple :

#On se déplace dans le dossier /img/all/
print 'cwd(\'/img/all/\') --> ';
$ftp->cwd('/img/all/')
  or die "Cannot go : ".$ftp->message;
print $ftp->pwd()."\n";

#On retourne à la racine
print 'cwd() --> ';
$ftp->cwd()
  or die "Cannot go : ".$ftp->message;
print $ftp->pwd()."\n";

Vous devriez alors avoir à l’écran :

cwd('/img/all/') --> /img/all
cwd() --> /

cdup() : Aller au dossier parent

Cette méthode qui s’utilise sans paramètres, permet de retourner au dossier parent du dossier dans lequel on se trouve actuellement.

Si je reprends l’exemple que j’ai utilisé précédemment, le dossier parent de /img/all/ est /img. Et le dossier parent de /img est la racine, à savoir /.

Voyons immédiatement un exemple :

#On se place dans /img/all/
print 'cwd(\'/img/all/\') --> ';
$ftp->cwd('/img/all/')
  or die "Cannot go : ".$ftp->message;
print $ftp->pwd()."\n";

#On se place dans le dossier parent /img/
print 'cdup() --> ';
$ftp->cdup()
  or die "Cannot go : ".$ftp->message;
print $ftp->pwd()."\n";

Vous devriez alors voir s’afficher ceci sur votre écran :

cwd('/img/all/') --> /img/all
cdup() --> /img

Maintenant que nous savons nous repérer sur un serveur FTP, nous allons aborder les fonctions qui vont nous permettre de manipuler les fichiers présents sur notre serveur.

Commentaires