2016-05-31 15 views
0
sub searchInDirectory 
{ 
    my @directorylist; 
    opendir my $dir, $_[0] or die "Unable to open directory"; 
    while (my $file = readdir $dir) 
    { 
     if(-f "$file") 
     { 
      #process file 
     } 
     elsif((-d "$file") && !($file =~ /^\.{1,2}$/)) #directory && not .. or . 
     { 
      push @directorylist, $file; 
     } 
    } 
    closedir($dir); 
    foreach my $diritem (@directorylist) 
    { 
     &searchInDirectory($_[0] . "/" . $diritem); 
    } 
} 

Dies ist mein Code zum rekursiven Durchsuchen der Unterverzeichnisse und Dateien eines Verzeichnisses. Das Problem ist, dass es beim ersten Durchlauf funktioniert, aber beim zweiten Aufruf schlägt die Verzeichnisprüfung fehl. Ich habe überprüft, um sicherzustellen, dass es Dateien vs Ordner korrekt identifiziert, was es ist. Es ist auch nicht versäumt, die Verzeichnisse zu öffnen, so dass ich nicht verstehe, warum es nicht erkannt werden würde, und rufen Sie die Funktion erneut auf. Ich würde mich sehr gerne an diese Methode halten, anstatt andere Bibliotheken zu verwenden.Perl-Verzeichnisprüfung fehlgeschlagen bei rekursivem Aufruf

Antwort

4

readdir kehrt nicht vollständige Pfade, so müssen Sie das Verzeichnis vorangestellt wird, bevor Datei Tests versuchen zu tun:

sub searchInDirectory { 
    my $path = shift; 

    opendir(my $dh, $path) or die $!; 
    my @files = map { "$path/$_" } grep { not /^\./ } readdir($dh); 
    closedir($dh); 

    for my $file (@files) { 
     if (-d $file) { 
      searchInDirectory($file); 
     } elsif (-f $file) { 
      # process file 
     } 
    } 
} 
1

Beachten Sie, dass Ihre Datei-Suchroutine, die durch Verwendung von File::Find::Rule vereinfacht werden kann. Zum Beispiel:

File::Find::Rule->file->exec(sub { say "File: $_" })->in($dir); 
Verwandte Themen