> Tech > Lire des répertoires de manière récursive

Lire des répertoires de manière récursive

Tech - Par iTPro - Publié le 24 juin 2010
email

Comme le démontre le programme READDIR, il est facile de lire le contenu d’un répertoire en RPG. Mais réfléchissons à la question suivante : qu’adviendrait- il si vous vouliez lire tout ce qui se trouve à l’intérieur d’un certain répertoire ? Pas seulement la liste des fichiers, mais aussi le

contenu de chaque répertoire qui existe dans le répertoire, et les fichiers présents dans les répertoires qui sont dans les répertoires, et ainsi de suite, jusqu’à ce que vous ayez lu tout le contenu de ce répertoire ?

C’est moins compliqué qu’il n’y paraît grâce à l’aptitude du RPG d’appeler une sous-procédure récursivement. Par « récursivement », j’entends que la sous-procédure s’appelle elle-même. Lors de chaque nouvel appel adressé à ellemême, une nouvelle copie de la sous-procédure est ajoutée à la pile d’appels, et cette copie a ses propres variables.

Cette idée est intéressante parce que vous pouvez écrire une sous-procédure qui lit le contenu d’un répertoire. Chaque fois que la sous-procédure trouve une entrée de répertoire qui pointe vers un autre répertoire, la sous-procédure peut s’appeler elle-même pour traiter ce nouveau répertoire. Ainsi, la sous-procédure se déplace dans toute l’arborescence de répertoires et traite tout ce qui s’y trouve.

La figure 9 montre des extraits du programme RECURSEDIR. Ce programme additionne toutes les tailles de tous les objets disque dans votre répertoire courant et ses éventuels sous-répertoires. Vous savez ainsi combien d’espace disque ils utilisent. Pour calculer la taille d’un répertoire différent, vous pouvez changer de répertoire courant et réexécuter le programme.

Le programme RECURSEDIR commence par utiliser l’API getcwd () pour extraire le CWD (A en figure 9). Il extrait le CWD parce que la sous-procédure CalcSpace () changera le CWD. Pour que l’utilisateur ne soit pas décontenancé, le chemin conduisant au CWD est sauvegardé dans la variable CurDir, puis le CWD est changé à nouveau au terme de la sous-procédure CalcSpace (). Comme chaque objet du répertoire doit être examiné pour voir l’espace disque qu’il occupe et pour voir aussi si c’est ou non un répertoire, l’opération sera plus rapide si le CWD est établi dans le répertoire faisant l’objet du traitement. Pour cela, la sous-procédure CalcSpace () commence par appeler l’API opendir () pour changer le CWD en répertoire à traiter (B en figure 9). CalcSpace utilise ensuite l’API opendir () pour ouvrir la liste d’objets présente dans le répertoire (C en figure 9).

Comme le programme veut ouvrir et traiter chaque répertoire qu’il trouve, il est important de sauter les éléments de répertoire spéciaux qui représentent le répertoire courant et le répertoire parent. Faute de quoi, on entrerait dans une boucle sans fin ! Ces deux valeurs spéciales sont sautées en D, figure 9.

Si vous lisez le cinquième article de cette série (« Obtenir des informations à propos de vos fichiers, », juillet-août 2005, www.itpro.fr Club abonnés), vous connaissez bien l’API stat () qui donne des informations sur un fichier de l’IFS. Cet exemple utilise une API similaire, lstat (). La seule différence entre les deux API est que lstat () ne suit pas les liens symboliques. C’est important pour calculer l’espace disque, parce qu’on veut connaître la taille du lien symbolique lui-même plutôt que la taille de l’objet vers lequel il pointe, sauf ci ce dernier se trouve aussi dans l’arbre des répertoires que vous êtes en train d’examiner. C’est pourquoi j’ai utilisé l’API lstat () dans cet exemple (E en figure 9).

L’API stat () renvoie une structure de données qui contient des renseignements sur le fichier. Pour cet exemple précis, nous voulons savoir deux choses : si le fichier est un répertoire et combien d’espace disque il occupe. Cette valeur est stockée dans l’élément st_allocsize de la structure de données. L’élément st_mode de cette structure de données contient un bit qui marque cet objet comme un répertoire. J’ai écrit la sous-procédure S_ISDIR (H en figure 9) pour interroger le bit approprié à partir du mode, pour déterminer si l’objet est un répertoire. Si l’objet est bien un répertoire, la sous-procédure CalcSpace () est appelée à nouveau, cette fois avec le nom du nouveau sous-répertoire qui vient d’être trouvé (F en figure 9). Une nouvelle copie de la sous-procédure CalcSpace () est créée pour traiter ce nouveau sous-répertoire, et la copie originale attend que la nouvelle copie ait fini, avant de poursuivre.

Cette copie additionne les tailles des objets présents dans le nouveau sous-répertoire, si nécessaire en lançant d’autres copies de CalcSpace () Au terme de la sous-procédure CalcSpace (), la valeur spéciale de « .. » est utilisée pour revenir au répertoire parent (G en figure 9). Ainsi, chaque fois qu’une nouvelle copie de CalcSpace () est lancée, elle traite son propre répertoire et revient au répertoire parent avant que la copie précédente de CalcSpace () continue. On l’aura compris, cela évite à la copie précédente de CalcSpace () de perdre sa place !

Téléchargez gratuitement cette ressource

Guide de Services Cloud Managés

Guide de Services Cloud Managés

Accélérer votre transformation digitale, protéger et sécuriser vos environnements Cloud avec les offres de support, d'accompagnement et de services managés. Découvrez le TOP 3 des Services Managés pour accompagner la transformation de vos environnements Cloud, gagner en agilité et en sécurité dans un monde d'incertitudes.

Tech - Par iTPro - Publié le 24 juin 2010