# (gH) -_- alldsc2.txt ; TimeStamp (unix) : 30 Novembre 2005 vers 16:24 $version = "3.81" ; print " alldsc (gH) ; version $version \n" ; ################################################################## ################################################################## # ceci n'est pas un IPOD ! =head1 NAME alldsc : tous les fichiers descriptifs du répertoire =head1 DESCRIPTION ce programme met en forme la liste de tous les fichiers descriptifs du répertoire (fichiers dont l'extension est DSC, en majuscule, minuscule ou mixte) pour le rapport hebdomadaire du comité de direction. la mise en forme aboutit à un fichier RTF. =cut ################################################################## ################################################################## use File::stat; use Time::localtime; # pour un affichage 'à la française' sans passer par les "LOCALE" %lstmois = ("Jan","Janvier","Feb","Février","Mar","Mars","Apr","Avril","May","Mai","Jun","Juin", "Jul","Juillet","Aug","Août","Sep","Septembre","Oct","Octobre","Nov","Novembre","Dec","Décembre") ; ################################################################## # y a-t-il eu un paramètre de passé ? if ($#ARGV==-1) { # non ! on le dit et on rappelle la syntaxe avant de sortir print "\n" ; print " Mais... vous n'avez pas indiqué où chercher les fichers descriptifs !\n\n" ; print " La syntaxe est : alldsc LIEU\n\n" ; print " - si vous êtres sous Windows, il faut écrire donc quelque chose comme : \n\n" ; print " alldsc K:\Stat_Ad\ \n\n" ; print " - si vous êtres sous Linux, il faut écrire quelque chose comme : \n\n" ; print " alldsc ~/Cours/Stockage/ \n\n" ; print " - dans les deux cas, pour chercher à l'endroit où vous êtes, il faut écrire : \n\n" ; print " alldsc .\n" ; print "\n" ; exit(-1) ; } ; # fin de si ################################################################## # si nous sommes arrivés ici, c'est qu'il y avait un paramètre : # on le complète éventuellement par le symbole slash pour indiquer qu'il s'agit d'un répertoire $lieu = $ARGV[0] ; if (substr($lieu,-1,1) ne "/") { $lieu .= "/" ; } ; # on efface éventuellement le fichier de sortie et ouvre le "fhandle" $fs = "alldsc.rtf" ; unlink($fs) if -M $fs ; open(FRTF,">$fs") or die ("impossible d'écrire dans $fs") ; # début (fixe) du fichier RTF print FRTF << 'DEBUT_RTF' ; {\rtf1 {\fonttbl {\f0\fswiss Arial;} {\f1\fmodern Courier New;} } {\stylesheet {\s0 Nom de liste;} {\s1 Description de fichier;} } \pard\plain\lang1036 DEBUT_RTF # construction de la liste des fichiers opendir(DSCDIR, $lieu) || die " je ne peux pas ouvrir le répertoire $lieu\n\n"; @listefic = readdir(DSCDIR); closedir DSCDIR; # la date courante correspond au fichier RTF de sortie $belledate = &ageFichier("",$fs) ; # on passe la liste en revue pour ne retenir que les fichiers dont l'extension # aboutit à dsc en maju, minu ou mixte foreach $idf (@listefic) { push(@lstdsc,"$idf") if ($idf =~ /\.dsc$/i) ; } ; # fin pour idf # on calcule le nombre de pages $nbFic = $#lstdsc ; $lignesParpage = 50 ; $nbPages = int( $nbFic / $lignesParpage ) ; $nbPages += 1 if $nbFic % $lignesParpage ; $nbPages *= 2 ; # car on a deux listes # on écrit le premier numéro de page $numPage = 1 ; &ecritNumerodePage() ; ## print " $nbFic fichiers donc $nbPages pages\n" ; ################################################################## print "\n # préparation de la liste par ordre alphabétique direct\n" ; print FRTF "\\par\\s0\\f0\\fs28\{\\b Liste alphabétique des fichiers au $belledate\}\n" ; # l'instruction suivante (en commentaire) est sans doute plus rapide à l'exécution # foreach $nomfic (sort igncas @lstdsc) { # mais celle-ci est plus explicite : $nbfdsc = 0 ; foreach $nomfic (sort { lc($a) cmp lc($b) } @lstdsc) { &montreFichierEnRtf(++$nbfdsc,$nomfic) ; } ; # fin pour $nomfic # on insère un saut de page (ce qui augmente le numéro de page courante) &nouvellePage() ; ################################################################## print "\n # préparation de la liste par age croissant \n" ; print FRTF "\\par\\s0\\f0\\fs28\{\\b Liste par date des fichiers au $belledate\}\n" ; # on complète chaque nom de fichier avec le lieu # et on stocke devant la date en jours ; pour éviter # les ex-aequo, on ajoute le nom du fichier en bout de date # ce qui produit une table de hachage foreach $x (@lstdsc) { $laclef = -M "$lieu$x" ; $laclef .= $x ; $lstdat{ $laclef } = $x ; } ; # fin de pour chaque # affichage trié : il ne faut pas oublier de # forcer le tri en numérique à cause des noms # de fichier en bout de date. $nbfdsc = 0 ; foreach $datfic (sort { $b <=> $a } keys %lstdat) { &montreFichierEnRtf(++$nbfdsc,$lstdat{$datfic}) ; } ; # fin de tant que sur datfic # on finit le fichier RTF et on le ferme print FRTF << 'FIN_RTF' ; {\par } } FIN_RTF close(FRTF) ; # sortie normale du programme print "\n vous pouvez utiliser le fichier $fs\n\n" ; exit(0) ; ############################################################### ############################################################### # sous programme pour bien afficher les fichiers sub montreFichierEnRtf { local ($numf,$nomf) = @_ ; $ligne = sprintf(" %3d. %-25s ",$numf,uc($nomf)).&ageFichier($lieu,$nomf)." $nomf\n" ; print FRTF "\\par\\s1\\f1\\fs22\{$ligne\}\n" ; &nouvellePage() unless ($numf % $lignesParpage) ; } ; # fin sub montreFichierEnRtf # gestion de l'age du fichier # http://www.perl-gratuit.com/traduction/docfr/perllocale.html sub ageFichier { local ($mlieu,$nomf) = @_ ; $agefichier = ctime(stat("$mlieu$nomf")->mtime) ; @ageinfos = split(/\s+/,$agefichier) ; $jour = sprintf("%3d",$ageinfos[2]) ; $mois = sprintf("%-10s",$lstmois{$ageinfos[1]}) ; $an = $ageinfos[4] ; $agelisible = "$jour $mois $an" ; return($agelisible) ; } ; # fin sub ageFichier # fonction de tri pour les noms de fichier # on IGNore la CASse majuscule ou minuscule sub igncas { lc($a) cmp lc($b) } ; # pour gérer rapidement les numéros de page sub ecritNumerodePage { print FRTF "{page $numPage sur $nbPages}\n" ; } ; # fin sub ecritNumerodePage # gestion du saut de page sub sautDePage { print FRTF "\{\\page\}\n" ; $numPage++ ; } ; # fin sub ecritNumerodePage sub nouvellePage { &sautDePage() ; &ecritNumerodePage() ; } ; # fin sub nouvellePage