2010-09-06 3 views
2

J'essaie d'écrire un script qui traiterait certains fichiers. Les données sont organisées comme ceci: il y a un dossier (appelons-le X) où mon script sera placé. Dans ce même dossier, il y a un sous-dossier appelé 'data'. Cela contient plusieurs sous-dossiers avec des noms différents et chacun d'entre eux contient de nombreux fichiers (pas d'autres sous-dossiers, juste des fichiers). J'ai besoin de traiter tous les fichiers dans un sous-dossier (plus précisément, exécuter une fonction sur chaque fichier) et fusionner les résultats pour tous les fichiers du sous-dossier, donc pour chaque dossier il y a un résultat (peu importe le nombre de fichiers). Le problème est, je ne suis pas capable d'accéder aux fichiers pour pouvoir exécuter ma fonction dessus. Ce que j'ai maintenant est ceci:Comment obtenir les contenus des répertoires imbriqués en Perl

$dirname = "data"; 

opendir (DIR, $dirname) || die "Error in opening dir $dirname\n"; 

while(($dirname2 = readdir(DIR))) 
{ 
    next if $dirname2 eq "."; 
    next if $dirname2 eq ".."; 

    opendir (DIR2, $dirname2) || die "Error in opening dir $dirname2\n"; 

    while(($file = readdir(DIR2))) 
    { 
     next if $file eq "."; 
     next if $file eq ".."; 

     print("file:$file\n"); 
    } 

    closedir(DIR2); 

} 
closedir(DIR); 

Il échoue toujours avec le message "Erreur lors de l'ouverture du répertoire". 'alex' se trouve être le premier répertoire dans le répertoire de données. Ma question est: où est le problème? Est-ce même la bonne façon de réaliser ce que j'essaie de faire? Je m'inquiète aussi que ceci échoue s'il y a un dossier aussi dans le dossier de données, puisque je ne peux pas l'ouvrir avec opendir, ou je peux? PS: désolé pour cet horrible code Perl - j'essaie toujours d'apprendre cette langue.

Merci, Peter

+0

'die "Erreur dans l'ouverture dir dirname $: $"' vous donnera la raison, voir [perldoc perlvar] (http://perldoc.perl.org/perlvar.html#%24OS_ERROR). Mieux encore, supprimez le '|| die ... 'parts, add' utilise autodie qw (: all); 'et laisse le module [autodie] (http://p3rl.org/autodie) gérer/signaler les erreurs. – daxim

Répondre

2

Vous pouvez File::Path - Créer ou supprimer des arborescences

Comme je suis en cours d'exécution de votre programme, je pense que vous avoir à spécifier votre chemin complet lors de l'ouverture d'un répertoire ie,

opendir (DIR2, $dirname.\\.$dirname2) || die "Error in opening dir $dirname2\n"; #running code on windows 

I Ça va marcher, essayez-le.

+0

C'était l'erreur cruciale. Je vous remercie! – PeterK

2

Etes-vous sûr que le dossier interne n'existe que des dossiers? Ajouter une vérification supplémentaire:

next if !(-d $dirname2); 
+0

Merci, cela aidera. – PeterK

2

Voici une version légèrement nettoyée de ce qui a été posté dans la question.

use strict; 
use warnings; 
use autodie; 
use File::Spec::Functions qw'catdir catfile'; 

my $dirname = "data"; 

{ 
    opendir my $dir_h, $dirname; 

    while(my $dirname2 = readdir($dir_h)){ 
     next if $dirname2 eq "."; 
     next if $dirname2 eq ".."; 

     $dirname2 = catdir($dirname, $dirname2); 
     next unless -d $dirname2; 
     opendir my $dir_h2, $dirname2; 

     while(my $file = readdir($dir_h2)) 
     { 
      next if $file eq "."; 
      next if $file eq ".."; 

      $file = catfile($dirname2,$file); 
      if(-f $file){ 
       print("file:$file\n"); 
      } 
     } 
     # $dir_h2 automatically closes here 
    } 
    # $dir_h automatically closes here 
} 

Si vous allez exécuter sur les versions de Perl 5.12.0 plus tôt que vous devez envelopper la condition de boucle while avec defined().

while(my $dirname2 = readdir($dir_h)){ 
    while(defined(my $dirname2 = readdir($dir_h))){ 
Questions connexes