Hallo zusammen,
den Wunsch, eine Liste aller (oder bestimmter) Dateien in einem bestimmten Verzeichnis und aller Unterverzeichnisse zu erzeugen, findet man zu hunderten im Netz. Was dort empfohlen wird, sieht in etwa so aus:
use File::Find;
FileList("C:/test");
sub FileList {
my $RootPath = shift;
my @PDF = ();
find( sub { push @PDF, $File::Find::name if /.pdf$/ }, $RootPath);
print "$#PDF files\n";
return(@PDF);
};
Diese Routine benötigt in einem speziellen Fall (ca. 4000 Files in ca. 100 Unterverzeichnissen) ca. 40 Sekunden.
Das ist mir zu langsam.
Also habe ich eine etwas umständlichere Variante geschrieben (s.u.)
Diese Routine benötigt für das identische Verzeichnis ca. 8-10 Sekunden.
Mache ich da oben etwas falsch?
Vielleicht funktioniert die untere Variante nicht auf allen Systemen?
Kann mir das einer erklären...?
FileListFast("C:/test");
sub FileListFast {
my $RootPath = shift;
my @PDF = ();
my @DirList = ();
my @List = qx(dir "$RootPath" /-C /S); # execute, read directory
my $Directory = "";
my @FileList = ();
foreach (@List) {
if (/(\d\d.\d\d.\d\d\d\d)\s+(\d\d:\d\d)\s+(\d+)\s(.+).pdf$/) {
my ($Date, $Time, $Size, $Filename) = ($1, $2, $3, $4);
push(@PDF,$Directory.$Filename);
}
else {
if (/ Directory of (.+)\n/) {
$Directory = $1;
$Directory =~ s/\///g; # change backslash to foreslash
push(@DirList,$Directory);
};
};
};
print "$#PDF files in $#DirList directories\n";
return(@PDF);
};