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

  FORUM HardWare.fr
  Programmation
  Perl

  parcourir un dossier (je le relance)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

parcourir un dossier (je le relance)

n°1381306
Lanfeust42
Posté le 05-06-2006 à 14:18:03  profilanswer
 

Bonjour, c'est encor moi désoler.
 
Voila je dois parcourir un dossier et rechercher tous les fichier .pdf et les convertir en txt, pour la conversion j'ai trouver pdftotext pour convertir les fichiers ca me semble bien et je voulais savoir si il existait une commande pour trouver tous les fichier pdf??
 
Merci de votre attention.


Message édité par Lanfeust42 le 07-06-2006 à 09:26:50
mood
Publicité
Posté le 05-06-2006 à 14:18:03  profilanswer
 

n°1381335
Lanfeust42
Posté le 05-06-2006 à 14:48:50  profilanswer
 

Hum j'ai trouver ceci il parais que ce programme compte les fichier et dossier d'un repertoire pour moi il affiche toujours 0 fichiers et 2 répertoire
 
my $nbrep = 0;
my$nbfic = 0;
my $dossier = "c:\\Documents and Settings\\toto" );
opendir DIR, $dossier or die "$dossier n'existe pas !";
my @files = readdir DIR;
foreach my $fichier (@files) {
if (-f $fichier) { $nbfic++; }
elsif (-d $fichier) { $nbrep++; }
}
close DIR;
print "Il y a $nbfic fichier(s) et $nbrep répertoire(s) dans $dossier.\n";
 
J'ai aussi trouver la fonction glob:
 
my @fichiers_pdf = glob("c:\\Documents and Settings\\toto*.pdf" );
 
foreach my $scalar(@fichiers_pdf) {
  print "$scalar\n";
}
 
Mais la non plus rien de concluant
 
alors je le dit ... à l'aide


Message édité par Lanfeust42 le 05-06-2006 à 15:28:06
n°1381451
pospos
Posté le 05-06-2006 à 16:51:31  profilanswer
 

achete toi le perl cookbook

n°1381521
Lanfeust42
Posté le 05-06-2006 à 17:54:33  profilanswer
 

quelqu'un a une autre solution svp

n°1381544
pospos
Posté le 05-06-2006 à 18:14:09  profilanswer
 
n°1381748
Lanfeust42
Posté le 06-06-2006 à 08:51:06  profilanswer
 

Merci Pospos tu va me trouver un peu chiant pi être ou un peu c.. sur les bords mais j'ai toujours pas compris la fonction glob  :sweat:

n°1381811
pospos
Posté le 06-06-2006 à 09:55:47  profilanswer
 

la fonction glob emule le glob du shel: il te sort tous les fichiers qui matchent le pattern que tu lui donne (un peu comme une regexp)
 
genre a*.pdf va matcher a1.pdf, a2.pdf, etc...

n°1381823
Lanfeust42
Posté le 06-06-2006 à 10:07:42  profilanswer
 

Bon c'est bien ce que j'avais compris, merci mais cette fonction ne fonctionne que sous Unix je crois? Non? Et le problème c'est que mon entreprise est sous Windows (y on pas encor compris pourquoi linux c'est bien) et donc dans mes pérégrination j'ai trouver DosGlob que je n'arrive pas du tout à faire marcher sur cpan on trouve ceci:
 

Code :
  1. # override CORE::glob in current package
  2.     use File::DosGlob 'glob';
  3.     # override CORE::glob in ALL packages (use with extreme caution!)
  4.     use File::DosGlob 'GLOBAL_glob';
  5.     @perlfiles = glob  "..\\pe?l/*.p?";
  6.     print <..\\pe?l/*.p?>;


 
j'ai remplacer ainsi:

Code :
  1. # override CORE::glob in current package
  2.     use File::DosGlob 'glob';
  3.     # override CORE::glob in ALL packages (use with extreme caution!)
  4.     use File::DosGlob 'GLOBAL_glob';
  5.     my @fichiers_pdf = glob("c:\\Documents and Settings\\toto\\*.pdf" );
  6.     foreach my $scalar(@fichiers_pdf) {
  7.   print "$scalar\n";
  8. }


 
ca me met une erreur dans le fichier DosGlob, et je ne comprend pas pourquoi.
 
Merci de ton aide


Message édité par Lanfeust42 le 06-06-2006 à 10:36:26
n°1381978
Aricoh
gentil mais fo po pousser
Posté le 06-06-2006 à 12:39:37  profilanswer
 

A tester, autre solution :
 

Code :
  1. my $rep = "C:\toto\beurk\pouet\pdf";
  2. chdir $rep;
  3. my @ListePDF = <*.pdf>;
  4. foreach(@ListePDF)
  5. {
  6.     print "fichier $_ est un PDF\n";
  7. }


---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
n°1382021
Lanfeust42
Posté le 06-06-2006 à 13:41:04  profilanswer
 

youpi ca marche merci bocoup c'est trop bien  
 
euhh juste un petit détail comment faire pour lui dire que le répertoire c'est celui ou je suis??


Message édité par Lanfeust42 le 06-06-2006 à 13:45:29
mood
Publicité
Posté le 06-06-2006 à 13:41:04  profilanswer
 

n°1382034
Aricoh
gentil mais fo po pousser
Posté le 06-06-2006 à 13:53:56  profilanswer
 

Essaie ceci dans ton script :
 

Code :
  1. use Cwd;    # à mettre au début du script
  2. $dir = cwd;
  3. print "repertoire courant = $dir\n";


 
Si ton script doit être installé dans le même dossier que tes PDF, tu peux virer le chdir que je fais, tu n'en as pas besoin dans ce cas. Enfin normalement.


Message édité par Aricoh le 06-06-2006 à 13:54:42

---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
n°1382073
Lanfeust42
Posté le 06-06-2006 à 14:28:32  profilanswer
 

merci plein bocoup tu me sort une épine du pied

n°1382135
pospos
Posté le 06-06-2006 à 15:22:30  profilanswer
 

File::Glob marche aussi bien sous windows que sous linux, et sert maintenant à implementer le glob du core de perl (le < > )

n°1382259
Lanfeust42
Posté le 06-06-2006 à 17:16:33  profilanswer
 

ouai mais j'arrive pas à le faire tourner c'est hyper bizar j'ai la bonne commande je pense, donc je comprend pas

n°1382573
Lanfeust42
Posté le 07-06-2006 à 09:37:19  profilanswer
 

oui bon c'"est encore moi, en faite je pensais faire la suite finger in the noz mais ...non  :(  
 
voila mon code :
 

Code :
  1. use Cwd;
  2. use strict;
  3. use warnings;
  4. my $dir = cwd;
  5. #my $dir = $ARGV[$0];
  6. my $nbrep = 0;
  7. my $nbfic = 0;
  8. my $pdftotxt = "C:\\Perl\\lib\\pdftotext";
  9. opendir DIR, $dir or die "$dir n'existe pas !";
  10. my @files = readdir DIR;
  11.     foreach my $fichier (@files) {
  12.        
  13.         if ($fichier =~ /^\./){}
  14.         else{
  15.         print "$fichier\n";
  16.         if (-f $fichier) {
  17.             $nbfic++;
  18.             if ($fichier !~ /\.pdf/){print "pas pdf\n";}
  19.             else{
  20.             system($pdftotxt,$fichier);
  21.             print "pdf OK\n";
  22.             }
  23.         }
  24.         else{
  25.             if (-d $fichier) {
  26.             $nbrep++;
  27.             print "rep\n";
  28.             sleep 10;
  29.             }
  30.         }}
  31.     }
  32. close DIR;
  33. print "Il y a $nbfic fichier(s) et $nbrep répertoire(s) dans $dir.\n";
  34. sleep 50;


 
Comme vous pouvez le voir je veux maintenant parcourir les sous-répertoire, j'ai penser àdu récursif au début mais en cherchant  j'ai trouver un message disant que le récursif en PERL c'est nul:http://forum.hardware.fr/hardwaref [...] 2740-1.htm
 
donc je me suis dit utilisont une boucle alors mais le problème c'est que j'ai un problème de répertoire:
 
imaginons, je trouve un nouveau répertoire, je l'ouvre (opendir) mais ensuite comment je fait pour rappeler mon programme dessus?? le chemin est diffférent :pt1cable:  :pt1cable:  
 
Voila mon drame


Message édité par Lanfeust42 le 07-06-2006 à 09:39:07
n°1382651
Lanfeust42
Posté le 07-06-2006 à 10:45:29  profilanswer
 

ahah j'avance un peu(j'aime bien parler tout seul)
 

Code :
  1. use Cwd;
  2. use strict;
  3. use warnings;
  4. my $dir = cwd;
  5. #my $dir = $ARGV[$0];
  6. TOTO:
  7. print "$dir\n";
  8. sleep 10;
  9. my $nbrep = 0;
  10. my $nbfic = 0;
  11. my $pdftotxt = "C:\\Perl\\lib\\pdftotext";
  12. opendir DIR, $dir or die "$dir n'existe pas !";
  13. my @files = readdir DIR;
  14.     foreach my $fichier (@files) {
  15.        
  16.         if ($fichier =~ /^\./){}
  17.         else{
  18.         print "fichier:$fichier\n";
  19.         #if (-f $fichier) {
  20.             $nbfic++;
  21.         if ($fichier =~ /\.pdf/){
  22.             my $traitPDF = $dir . "/". $fichier;
  23.             system($pdftotxt,$traitPDF);
  24.             print "pdf OK\n";
  25.         }
  26.         #    else{
  27.         #    system($pdftotxt,$fichier);
  28.         #    print "pdf OK\n";
  29.         #    }
  30.         #}
  31.         else{
  32.             if (-d $fichier) {
  33.             $nbrep++;
  34.             print "rep\n";
  35.             $dir .= "/".$fichier;
  36.             print "$dir\n";
  37.            
  38.             goto TOTO or die "pas goto n'existe pas !";
  39.             sleep 10;
  40.             }
  41.         }}
  42.     }
  43. close DIR;
  44. print "Il y a $nbfic fichier(s) et $nbrep répertoire(s) dans $dir.\n";
  45. sleep 50;


 
mais la encore ca fait des choses bizar, ca traite pas les PDF du premier dossier normal (les répertoire sont répertorier avant donc le premier fichier traiter est un répertoire)
ca traite les info du second dossier nikel mais ca oublie les répertoire suivant snif.

n°1382827
Lanfeust42
Posté le 07-06-2006 à 13:43:35  profilanswer
 

hum bizar j'avance encor mais autre problème, mon code pmarche bien pour le premier répertoire mais ne veut pas descendre dans les sous répertoire, il ne reconnais pas le type de fichier du sous répertoire (-d ou -f)
 

Code :
  1. use Cwd;
  2. use strict;
  3. use warnings;
  4. my $dir = cwd;
  5. my $nbrep = 0;
  6. my $nbfic = 0;
  7. my $pdftotxt = "C:\\Perl\\lib\\pdftotext";
  8. my @tabldoss;
  9. #my $dir = $ARGV[$0];
  10. TOTO:
  11. my $dirsav=$dir;
  12. print "répertoire:$dir\n\n";
  13. #sleep 10;
  14. opendir DIR, $dir or die "$dir n'existe pas !";
  15. my @files = readdir DIR;
  16.    
  17.     foreach my $fichier (@files) {
  18.         print "\nvariable fichiez:$fichier\n";
  19.         if ($fichier =~ /^\./){}
  20.         else{
  21.             if (-f $fichier) {
  22.                 print "fichier:$fichier\n";
  23.                 $nbfic++;
  24.                 if ($fichier =~ /\.pdf/){
  25.                     my $traitPDF = $dir . "/". $fichier;
  26.                     system($pdftotxt,$traitPDF);
  27.                     print "pdf OK\n";
  28.                 }
  29.             }
  30.             else{
  31.                 if (-d $fichier) {
  32.                 print "dossier:$fichier\n";
  33.                 $nbrep++;
  34.                 $dir = $dirsav."/".$fichier;
  35.                 push(@tabldoss,$dir);
  36.                 }
  37.             }
  38.         }
  39.     }
  40. close DIR;
  41. foreach my $scalar (@tabldoss) {
  42. last if($tabldoss[0] eq "" );
  43. $dir=$scalar;
  44. print "\ntableau:$tabldoss[0]\n\n";
  45. $tabldoss[0] = $tabldoss[1];
  46. print "dir:$dir\n";
  47. #sleep 10;
  48. print "\n\n Il y a $nbfic fichier(s) et $nbrep répertoire(s) dans $dir\n\n";
  49. goto TOTO or die "pas goto n'existe pas !";
  50. }

n°1382832
Aricoh
gentil mais fo po pousser
Posté le 07-06-2006 à 13:46:50  profilanswer
 

Ton label TOTO, je me demande si ça pose pas un problème avec la ligne juste en dessous où tu déclares $dirsav avec my.
 
A chaque fois que ton programme boucle et revient sur le début de TOTO, il redéclare une variable $dirsav.
 
M'est avis qu'en compilant ton script avec les options -c -w passées à Perl, il devrait beugler :D


Message édité par Aricoh le 07-06-2006 à 13:48:21

---------------
Samsung Galaxy S1 -> Samsung Galaxy S2 -> Samsung Note 2 -> Huawei Ascend Mate 7 -> ZTE Axon 7 -> OnePlus 6T -> Oppo Find X2 PRO -> Google Pixel 9 PRO XL
n°1387892
krao
Posté le 15-06-2006 à 08:49:55  profilanswer
 

je crois qu'il y a une petite erreur dans une expression reguliere :
 

Citation :

if ($fichier =~ /^./){}


 
ce doit etre if ($fichier =~ /^[.]/){}
 
sinon tu ne rentres jamais dans le else puisqu'il cherche un fichier qui commence par n'importe quel caractere donc tous!
 
krao                  

n°1387935
Lanfeust42
Posté le 15-06-2006 à 10:23:24  profilanswer
 

Merci de votre aide désoler de pas vous répondre mais mon patron me fait plancher sur un truc autre en ce moment j'ai laisser mon code en vrac


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

  parcourir un dossier (je le relance)

 

Sujets relatifs
lister et compter les fichiers dans un dossierRépertoire par defaut avec un champ parcourir
Mapper un lecteur réseau à un dossier local[ASP.NET 2.0 ] Les dossier "App_*" d'un projet Web??
[Java] Parcourir tous les fichiers d'une URLrelance: mail to
remplacer les fichiers d'un dossier par d'autresparcourir ligne par ligne une selection
créer un dossier portant la date du jourboite de dialogue parcourir
Plus de sujets relatifs à : parcourir un dossier (je le relance)


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