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 :

Récupérer la taille d'un dossier...


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 52
    Points : 22
    Points
    22
    Par défaut Récupérer la taille d'un dossier...
    Bonjour,

    J'aimerais récupérer la taille d'un dossier de façon récursive :

    Voici mon code :

    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
    my $dir="/home/games/";
     
     
     
    print repSize($dir,0)."\n";
    exit;
     
    sub repSize
    {
    my $currentdir = shift;
    my $currentsize = shift;
    opendir(D,$currentdir) or die "Can't open $currentdir: $!\n";
    my @files=readdir(D);
    close(D);
    for(@files)
    {
      if (-d "$currentdir/$_" && $_ ne '.' && $_ ne '..')
      {
        $currentsize+=repSize("$currentdir/$_", $currentsize);
      }
      else  
     {
        $currentsize+=(-s "$currentdir/$_");
      }
    }
    $currentsize = (($currentsize/1024)/1024);
     
    #INSERTION BDD
    Le problème, c'est qu'il ne calcul que le dossier demandé, et non pas les autres dossiers en plus créés dedans...

    Pouvez-vous m'aider ?

    Merci d'avance,
    Benjamin.

  2. #2
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 861
    Points : 4 828
    Points
    4 828
    Par défaut
    Salut

    Voilà ce que je te propose :
    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 get_size {
    	my $size = $_[1];
    	print "Analyse de $_[0]\n";
    	chdir($_[0]);
    	opendir(D,$_[0]) or die "Can't open $_[0]: $!\n";
    	my @files=readdir(D);
    	close(D);
    	foreach my $file (@files){
    		chomp $file;
    		next if ($file eq "." or $file eq "..");
    		$file = $_[0]."/".$file;
    		if (-f $file){
    			my @stat = stat($file);
    			print "Taille de $file = $stat[7]\n";
    			$size = $size+$stat[7];
    		}
    		elsif(-d $file) {
    			$size = get_size($file, $size);	
    		}
    	}
    	return $size;
    }
     
    my $root = "/home/david/Documents/Coding/Perl";
    my $taille = get_size($root, 0);
    print "La somme de tous les fichiers contenus dans $root est $taille o.\n";
    Ce code fonctionne sous Unix.
    Je pense qu'il ne te sera pas trop difficile de le comprendre mais si tu as besoin n'hésites pas

    @++

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    Merci,
    Mais aparament, il donne un faux résultat, il me donne 8705425 octets .. alors que dans le dossier il y a au moins 33 Mo...

    Dois-je modifier quelque chose à votre script ?

  4. #4
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Tiens, j'avais répondu, mais j'ai perdu mon message

    Voici une altération de ton code, qui le rend fonctionnel :
    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
    29
    30
    31
    32
    33
    34
    #!perl
     
    use strict;
    use warnings;
     
    my $dir="E:/mon_dossier";
     
    print repSize($dir)."\n";
    exit;
     
    sub repSize
    {
      my $dir = shift;
      my $size=0;
     
      opendir(D,$dir) or die "Can't open $dir: $!\n";
      my @files=readdir(D);
      close(D);
     
      for(@files)
      {
        if (-d "$dir/$_" && $_ ne '.' && $_ ne '..')
        {
          $size+=repSize("$dir/$_");
        }
        else  
        {
          $size+=(-s "$dir/$_");
        }
      }
      $size >>= 20; # >> 20 pour les Mo, >>10 pour les Ko
     
      return $size;
    }
    J'ai juste changé le nom de quelques variables, simplifié quelques syntaxes, et surtout :

    Il ne faut pas espérer modifier la valeur d'une variable passée en paramètres ! Celle-ci a une existence propre, c'est une copie locale à la fonction.

    Donc, soit il faut passer une référence à la variable, et modifier la valeur pointée par cette référence, soit il faut s'en passer. C'est la seconde option que j'ai retenu : la taille est propre a chaque répertoire interrogé et est retournée explicitement en fin de fonction.

    Voila, voila.

  5. #5
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 861
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 861
    Points : 4 828
    Points
    4 828
    Par défaut
    J'ai corrigé mon thread en conséquence pour qu'il donne le bon résultat. Apparemment, ma première version n'était pas suffisamment récurrente. J'ai donc modifié mon code plus haut mais je te le redonne aussi ici :
    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 get_size {
    	my $size = $_[1];
    	print "Analyse de $_[0]\n";
    	chdir($_[0]);
    	opendir(D,$_[0]) or die "Can't open $_[0]: $!\n";
    	my @files=readdir(D);
    	close(D);
    	foreach my $file (@files){
    		chomp $file;
    		next if ($file eq "." or $file eq "..");
    		$file = $_[0]."/".$file;
    		if (-f $file){
    			my @stat = stat($file);
    			print "Taille de $file = $stat[7]\n";
    			$size = $size+$stat[7];
    		}
    		elsif(-d $file) {
    			$size = get_size($file, $size);	
    		}
    	}
    	return $size;
    }
     
    my $root = "/home/david/Documents/Coding/Perl";
    my $taille = get_size($root, 0);
    print "La somme de tous les fichiers contenus dans $root est $taille o.\n";
    @++

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 52
    Points : 22
    Points
    22
    Par défaut
    C'est parfait !
    Je vous remercies beaucoup pour votre aide !

    Bonne continuation !

    @ Bientôt

    Benjamin.

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

Discussions similaires

  1. [Débutant] Récupérer la taille des fichiers/dossiers dans une même variable
    Par Bylliboy dans le forum VB.NET
    Réponses: 11
    Dernier message: 18/06/2014, 12h50
  2. Réponses: 7
    Dernier message: 12/06/2012, 16h31
  3. [J2ME][debutant] Récupérer la taille d'un écran
    Par kisscool31 dans le forum Java ME
    Réponses: 4
    Dernier message: 21/04/2005, 16h56
  4. Réponses: 2
    Dernier message: 13/08/2004, 16h50
  5. Réponses: 3
    Dernier message: 23/01/2004, 21h02

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