IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Limiter le nombre de fichiers lus par la fonction readdir


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 30
    Points : 28
    Points
    28
    Par défaut Limiter le nombre de fichiers lus par la fonction readdir
    Bonjour,

    Je voudrais limiter le nombre de fichiers lus par la fonction readdir dans le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    opendir DIR,$input or die "ERROR: ",$input," : ",$!;
    @files = readdir DIR;
    close DIR;
    Une idée ?

    Merci par avance de vos conseils.

  2. #2
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Bonjour,

    Vouloir limiter, pourquoi pas, mais sur quels critères ? Si tu ne veuxlire que les 20 premierès entrée du répertoires ou t'arrêter dès que tu as trouvé tel répertoire par exemple, c'est possible en lisant répertoitr par répertoire :
    opendir DIR,$input or die "ERROR: ",$input," : ",$!;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (my $fic = readdir DIR)
    {
        # $fic contiendra tour à tour chaque entrée de DIR
    }
    Cette solution te permettra de faire ce que je t'ai dit, ou même de tout lire sans mettre tout le contenu de DIR dans la RAM (ce que fais ton code).
    Est ce que cela te convient ?
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 30
    Points : 28
    Points
    28
    Par défaut
    Bonjour,
    Désolé pour le manque de précisions.
    En détail, le script va devoir traiter tous les fichiers d'un répertoire.
    Ce répertoire va avoir plusieurs dizaines de milliers de fichiers.
    Pour éviter tout problème, je voudrais limiter chaque passe de readdir aux mille premiers fichiers.
    En pratique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    sub inputdir {
    	print "INFO: Reading input directory...\n";
    	opendir DIR,$input or die "ERROR: ",$input," : ",$!;
    	@files = readdir DIR;
    	close DIR;
     
    	foreach (@files) {
    		next if ($_ =~ /^\.\.?$/);			# evite . et ..
    		next if ($_ =~ /\.tmp/);
    		if (-f $_) {						# si l'object est bien un fichier
    			push(@filetomove, "$input/$_,$output[$i]/$_");
    			$i ++;
    			if ($i == (scalar(@output))) {
    				$i = 0;
    			}
    		}
    	}
    }
    sub movefiles {
    	my $length = @filetomove;
    	while ($length > 0) {
    		my $line = shift(@filetomove);
    		($in, $out) = split(/,/,$line);
    		print "INFO: Move From: ",$in," To: ",$out,"\n";
    		rename("$in","$out") or warn "ERROR: ",$!,"\n";
    		$length = $length -1;
    	}
    }

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Il n'est pas possible de lire un nombre précis de nom de fichier d'un répertoire avec readdir, mais a priori tu n'as pas besoin de lire plusieurs nom de fichier d'un coup : ton traitement se fait fichier par fichier, il te suffit donc de les lire un par un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    sub inputdir {
      print "INFO: Reading input directory...\n";
      # ici je simplifie ton die
      opendir my($dir), $input or die "ERROR: $input : $!"; 
     
      my $i = 0;
      while(my $file = readdir $dir){
     
        next if ($file =~ /^\.\.?$/); # evite . et ..
        next if ($file =~ /\.tmp/); # evite les fichiers temporaires
     
        if (-f $_) { # si l'object est bien un fichier
     
          # as-tu vraiment besoin de séparer les phases de lecture et de déplacement ?
          my $in = "$input/$file";
          my $out = "$output[$i]/$file";
          print "INFO: Move From: $in To: $out\n";
          rename("$in","$out") or warn "ERROR: ",$!,"\n";
     
          # équivalent à ton if ...
          $i = ($i + 1) % @output;
        }
      }
     
      closedir $dir;
    }
    D'après ce que tu demandes (lire par lot arbitraire de 1000) j'ai eu l'impression que les phases de lecture et de déplacement sont indépendantes, je les ai donc regroupées.

    --
    Jedaï

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [EJB2.1] Limiter le nombre d'ojet remontés par les finders
    Par julienOriano dans le forum Java EE
    Réponses: 1
    Dernier message: 21/05/2007, 10h22
  2. Réponses: 4
    Dernier message: 21/03/2007, 15h32
  3. Réponses: 4
    Dernier message: 13/11/2006, 18h05
  4. Limiter le nombre d'enregistrements renvoyés par un SELECT
    Par Wilco dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/11/2004, 13h47
  5. [MFC] Limitation du nombre de fichiers...
    Par chronos dans le forum MFC
    Réponses: 5
    Dernier message: 02/06/2004, 10h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo