parcourir un dossier (je le relance)

parcourir un dossier (je le relance) - Perl - Programmation

Marsh Posté le 05-06-2006 à 14:18:03    

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
Reply

Marsh Posté le 05-06-2006 à 14:18:03   

Reply

Marsh Posté le 05-06-2006 à 14:48:50    

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
Reply

Marsh Posté le 05-06-2006 à 16:51:31    

achete toi le perl cookbook

Reply

Marsh Posté le 05-06-2006 à 17:54:33    

quelqu'un a une autre solution svp

Reply

Marsh Posté le 05-06-2006 à 18:14:09    

Reply

Marsh Posté le 06-06-2006 à 08:51:06    

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:

Reply

Marsh Posté le 06-06-2006 à 09:55:47    

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...

Reply

Marsh Posté le 06-06-2006 à 10:07:42    

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
Reply

Marsh Posté le 06-06-2006 à 12:39:37    

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
Reply

Marsh Posté le 06-06-2006 à 13:41:04    

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
Reply

Marsh Posté le 06-06-2006 à 13:41:04   

Reply

Marsh Posté le 06-06-2006 à 13:53:56    

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
Reply

Marsh Posté le 06-06-2006 à 14:28:32    

merci plein bocoup tu me sort une épine du pied

Reply

Marsh Posté le 06-06-2006 à 15:22:30    

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

Reply

Marsh Posté le 06-06-2006 à 17:16:33    

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

Reply

Marsh Posté le 07-06-2006 à 09:37:19    

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
Reply

Marsh Posté le 07-06-2006 à 10:45:29    

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.

Reply

Marsh Posté le 07-06-2006 à 13:43:35    

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. }

Reply

Marsh Posté le 07-06-2006 à 13:46:50    

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
Reply

Marsh Posté le 15-06-2006 à 08:49:55    

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                  

Reply

Marsh Posté le 15-06-2006 à 10:23:24    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed