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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
|
if ($^O =~ m/MSWin/) {
eval "use Win32::File qw(GetAttributes DIRECTORY)";
if( $@ ) {
die "Vous n'avez pas le module Win32::File comme vous devriez, informez-en votre support ou installez ce module...\n";
}
sub DIRECTORY;
}
my @dossiers = &generer_liste_repertoires(".",1); # DOssiers dans le dossier courant
my @tousFichiers = &generer_liste_fichiers("."); # tous les fichiers à partir du dossier courant
my $listeDossiers = &generer_liste_repertoires(".",0,1); # tous les dossiers à partir du dossier courant (récupère une référence de liste).
sub generer_liste_repertoires {
# Listage de dossiers, optimisé pour Linux et Windows
# $rep: dossier à lister
# $non_recursif: explicite (conserver cette condition negative pour compatibilité ascendante)
# $reference: si non nul, renvoit la reference de la liste de fichiers
my($rep,$non_recursif,$reference)=@_;
my @dossiers;
if ($^O =~ m/Win/) {
if (not $non_recursif) {
&Win32_listdirs($rep,\@dossiers,1); # Fonction optimisée pour listage recursif de dossiers
} # Fin if
else {
&Win32_listdirs($rep,\@dossiers,0); # Fonction optimisée pour listage recursif de dossiers
} # Fin else
} # Fin if
else { # Linux...
if ($non_recursif) {
&linux_listfiles($rep,\@dossiers,1,0) ;
} # Fin if
else {
&linux_listfiles($rep,\@dossiers,1,1) ;
} # Fin else
} # Fin else
if ($reference) { # C'est mieux!
return \@dossiers;
} # Finif
else { # Conserver pour compatibilité ascendante
@_=@dossiers;
} # Fin else
} # Fin sub
sub generer_liste_fichiers {
# Listage de fichiers, optimisé pour Linux et Windows
# $rep: dossier à lister
# $non_recursif: explicite (conserver cette conditionnel negative pour compatibilité ascendante)
# $reference: si non nul, renvoit la reference de la liste de fichiers
my ($rep,$non_recursif, $reference)=@_;
my @fichiers;
if ($^O =~ m/MSWin/) {
if (not $non_recursif) {
&Win32_listfiles($rep,\@fichiers,1); # Fonction optimisée pour listage recursif de fichiers
} # Fin if
else {
&Win32_listfiles($rep,\@fichiers,0); # Fonction optimisée pour listage recursif de fichiers
} # Fin else
} # Fin if
else { # Linux...
if ($non_recursif) {
&linux_listfiles($rep,\@fichiers,0,0) ;
} # Fin if
else {
&linux_listfiles($rep,\@fichiers,0,1) ;
} # Fin else
} # Fin else
if ($reference) { # C'est mieux!
return \@fichiers;
} # Finif
else { # Conserver pour compatibilité ascendante
@_=@fichiers;
} # Fin else
} # Fin sub
sub linux_listfiles {
# Fonction optimisée Linux pour lister les fichiers/dossiers d'un dossier, recursivement ou pas.
# Si $dossiers non nul, liste des dossiers, sinon des fichiers.
# Si $recursive non nul, recursif, sinon, ne liste que le dossier passé.
# $rListe est la ref de la liste à remplir
# Renvoit le nb d'elements listés
my ($path, $rListe, $dossiers, $recursive) = @_;
$path = File::Spec->rel2abs( $path );
printDebug("linux_listfiles","Recherche dans '$path'...\n(dossiers=$dossiers,rec=$recursive)",1);
my @files;
if( $recursive ) {
if ($dossiers) { # lister les dossiers?
find( { wanted => sub { push @{$rListe}, $File::Find::name if ( ($File::Find::name !~ m/\/\.\.?$/) && (-d $File::Find::name)) },
no_chdir => 1 }, $path );
} # Fin if
else { # lister les fichiers
find( { wanted => sub { push @{$rListe}, $File::Find::name if -f $File::Find::name },
no_chdir => 1 }, $path );
} # Fin else
} else {
opendir my($dir), $path;
while( defined( my $file = readdir $dir ) ) {
next if m/^\.\.?$/;
$file = File::Spec->catfile( $path, $file );
push @{$rListe}, $file if (((! $dossiers) && (-f $file)) || (($dossiers) && ($file !~ m/\/\.\.?$/) && (-d $file)));
}
closedir $dir;
}
return $#{$rListe};
} # Fin sub
sub Win32_listdirs {
# Fonction de listage de dossiers recursive, optimisee pour windows
# Rempli une liste passée par référence et renvoit le nombre de dossiers listés
my($path,$rListe,$recursive) = @_;
$path = File::Spec->rel2abs( $path );
printDebug("Win32_listdirs","Recherche dans '$path'...\n(rec=$recursive)",1);
#my $path = shift;
my $attr;
opendir my($dir), $path;
#my @files;
my $file;
no strict;
if ($recursive) {
while( defined( $file = readdir $dir ) ) {
next if $file =~ m/^\.\.?$/;
GetAttributes("$path\\$file", $attr);
if($attr & DIRECTORY) {
printDebug("Win32_listdirs","$file est un dossier",1);
push @{$rListe}, "$path\\$file";
&Win32_listdirs("$path\\$file",$rListe,$recursive); # Recursivité
} #Fin if
}
} # Fin if
else { # Non recursif
while( defined( $file = readdir $dir ) ) {
next if $file =~ m/^\.\.?$/;
GetAttributes("$path\\$file", $attr);
if ( $attr & DIRECTORY ) {
push @{$rListe}, "$path\\$file";
}
}
} # Fin else
use strict;
return $#{$rListe};
} # Fin sub
sub Win32_listfiles {
# Fonction de listage de fichiers recursive, optimisee pour windows
# Rempli une liste passée par référence et renvoit le nombre de fichiers listés
my($path,$rListe,$recursive) = @_;
$path = File::Spec->rel2abs( $path );
printDebug("Win32_listfiles","Recherche dans '$path'...\n(rec=$recursive)",1);
#my $path = shift;
my $attr;
opendir my($dir), $path;
#my @files;
my $file;
no strict;
if ($recursive) {
while( defined( $file = readdir $dir ) ) {
next if $file =~ m/^\.\.?$/;
GetAttributes("$path\\$file", $attr);
if($attr & DIRECTORY) {
printDebug("Win32_listfiles","$file est un dossier",1);
&Win32_listfiles("$path\\$file",$rListe,$recursive); # Recursivité
} else {
push @{$rListe}, "$path\\$file";
}
}
} # Fin if
else { # Non recursif
while( defined( $file = readdir $dir ) ) {
next if $file =~ m/^\.\.?$/;
GetAttributes("$path\\$file", $attr);
unless ( $attr & DIRECTORY ) {
push @{$rListe}, "$path\\$file";
}
}
} # Fin else
use strict;
return $#{$rListe};
} # Fin sub |
Partager