Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2766 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Script affichage taille fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Script affichage taille fichier

n°2236208
coolkis
Posté le 26-08-2014 à 11:38:53  profilanswer
 

Bonjour,
 
Je suis débutant en perl et je cherche à faire un script qui récupère les tailles en Ko de l'ensemble des fichiers d'un répertoire.
 
J'ai commencé à faire ceci :
 

Code :
  1. my $file = "C:\temp";
  2. my $taille = -s $file;
  3. print "$taille";


 
Mais cela ne m'affiche rien !
 
Est ce quelqu'un pourrait m'aider svp ?
Merci d'avance.

mood
Publicité
Posté le 26-08-2014 à 11:38:53  profilanswer
 

n°2236217
gilou
Modérateur
Modzilla
Posté le 26-08-2014 à 14:13:21  profilanswer
 

Si tu avais utilise les directives
use strict;
use warnings;
en tête de fichier, tu en aurais une idée.
 
"C:\temp"
on trouve un \t dans la chaine qui va être interprété comme un tab car c'est entre double quotes.
Il va falloir faire
'C:\temp'
avec des simples quotes, ou
"C:\\temp"
avec des doubles quotes et un \ doublé pour être interprété comme un \
 
Une fois ceci fait, tu vas avoir comme résultat 0...
 
Parce que si tu lis la doc, tu vois que quand on a un nom de répertoire, on ne peut pas l'utiliser directement avec les fonctions -s, -e, etc, contrairement aux noms de fichier.
Donc le test renvoie faux, ie 0.
La doc dit qu'il faut lui passer un dirhandle.
 
on le fait donc:
use strict;
use warnings;
 
my $file = 'C:\Temp';
opendir(my $dh, $file) || die "can't opendir $file: $!";
my $taille = -s $dh;
closedir($dh);
print $taille;
 
et la on a comme résultat  
> The dirfd function is unimplemented at dsiz.pl line 7.
 
Bref -s n'est pas implémentée pour renvoyer la taille des répertoires (au moins sous win32) et donc cette approche ne marche pas.
 
Donc on fait a la main le parcours récursif du répertoire et on incrémente la taille avec celle de chaque fichier trouvé:
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
 
my $dir = 'C:\Temp';
my $size = 0;
find( sub { $size += -f $_ ? -s _ : 0 }, $dir );
print $size, "\n";
 
find (du module File::Find) fait ceci avec l'appel find( sub { $size += -f $_ ? -s _ : 0 }, $dir):
On part de $dir et on parcourt récursivement le répertoire.
Pour chaque fichier ou répertoire trouvé, on appelle sub { $size += -f $_ ? -s _ : 0 } dessus (le nom du fichier ou répertoire est passé dans la variable $_ par find)
-f $_ ? -s _ : 0, c'est la même chose que -f $_ ? -s $_ : 0, ça teste si on a un fichier (-f), si oui, ça renvoie sa taille (-s), et 0 sinon.
donc $size += -f $_ ? -s _ : 0 va ajouter la taille du fichier courant (si c'est un fichier) lors du parcours récursif
Et donc le tout somme les tailles de tous les fichiers rencontrés lors du parcours récursif.
 
Autre méthode, si on est sous Windows (et qu'on utilise pas le script sous un autre OS), utiliser le module Win32::DirSize
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2236220
coolkis
Posté le 26-08-2014 à 14:38:07  profilanswer
 

Merci beaucoup gilou pour cette réponse !
Effectivement après avoir posté j'ai utilisé "les directives" ! Ceci dit ce n'est pas si simple que ça (je commence aujourd'hui le perl).
 
Par contre j'aimerai comme résultat : une ligne (taille) par fichier trouvé et nom la somme des tailles de tous les fichiers.
 
J'ai essayé d'enlever le + dans $size += -f $_ ? -s _ : 0 mais sans résultat !
 
Je vais continuer de chercher en parallèle.

n°2236236
gilou
Modérateur
Modzilla
Posté le 26-08-2014 à 16:02:50  profilanswer
 

C'est encore plus simple alors:
Pour chaque fichier rencontré lors du parcours récursif, on imprime la taille (et le nom dans mon exemple pour que ce soit plus lisible):
 
#!/usr/bin/perl  
use strict;  
use warnings;  
use File::Find;  
 
my $dir = 'C:\Temp';  
find( sub { print $_, " : ", -s $_, "\n" if -f $_ }, $dir );  
 
A+,

n°2236238
coolkis
Posté le 26-08-2014 à 16:12:40  profilanswer
 

Super, merci encore c'est exactement ce qu'il me fallait.

n°2236242
gilou
Modérateur
Modzilla
Posté le 26-08-2014 à 16:17:30  profilanswer
 

Je te conseille de lire la doc de File::Find: http://perldoc.perl.org/File/Find.html
Cela te permettra d'affiner selon tes besoins le code.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2236243
coolkis
Posté le 26-08-2014 à 16:21:06  profilanswer
 

Oui merci c'est ce que j'étais en train de faire !
Par contre juste une petite remarque, le code affiche la taille en octet !
Est ce que je peux facilement faire des calculs pour transformer la taille en Ko ou il y a plus simple à faire dans la ligne de code ?

n°2236274
gilou
Modérateur
Modzilla
Posté le 26-08-2014 à 19:44:38  profilanswer
 

Il suffit de faire le calcul:
 
#!/usr/bin/perl
use strict;
use warnings;
use File::Find;
 
my $dir = 'C:\Temp';
find( \&process, $dir );
 
sub process {
  if (-f $_) {
    my $size = -s _;
    # On arrondit au plus proche (on pourrait choisir un autre type d'arrondi).
    $size = int ( $size/1024 + 0.5 );
    print "$_ : ${size}k\n";
  }
}
 
A+,


Message édité par gilou le 26-08-2014 à 19:45:14

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2236291
coolkis
Posté le 27-08-2014 à 10:56:30  profilanswer
 

Merci gilou c'est parfait.

n°2236305
clubber43
Posté le 27-08-2014 à 13:47:41  profilanswer
 

Parfait ce Gilou :)
 
Tous les astuces donnees (et appronfondies) m'ont permis  
de decrocher un job en prog, ou le cpp est obligatoire mais aussi
ou le perl etait une competence supplementaire demandee...
 
La, je peux dire encore merci aussi :)
 
@+
Ju


---------------
Merci
mood
Publicité
Posté le 27-08-2014 à 13:47:41  profilanswer
 

n°2236347
gilou
Modérateur
Modzilla
Posté le 27-08-2014 à 22:57:35  profilanswer
 

   [:rougit]  
A+,


Message édité par gilou le 27-08-2014 à 22:57:53

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2236417
clubber43
Posté le 28-08-2014 à 14:20:28  profilanswer
 

---------------
A présidence nulle, croissance nulle. :wahoo:  
 
Pas mal :)


---------------
Merci

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Script affichage taille fichier

 

Sujets relatifs
Script changement auto stream TwitchEcrire dans un fichier binaire
Script pour alterner deux (ou trois) pubs sur le même emplacementconversion de fichier .cds -> .xls
affichage de fichier XML en JFrame (zone de texte)Remplacer un \ avec un / dans un chemin de fichier
affichage de résultat dans un interface JFramecomment installer des clé avec un fichier .bat
Aide script flash CS6 
Plus de sujets relatifs à : Script affichage taille fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR