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 :

Signalement de l'absence de fichiers


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 49
    Points : 26
    Points
    26
    Par défaut Signalement de l'absence de fichiers
    Bonjour à vous gourous du Perl !

    Toujours dans ma série "j'apprends sur le tas", je ne comprends ce qu'il se passe.
    J'ai écris le code ci-dessous dont le but est de transférer des fichiers (dont je ne connais pas le nom d'avance) d'un serveur sur un autre serveur.

    Le fait est que cela fonctionne lorsque les fichiers sont bien présents, mais ela fonctionne aussi lorsqu'ils ne le sont pas ! C'est à dire que je m'attendais à avoir "FIN ANORMALE DU SCRIPT" lorsque le move ne trouve pas de fichiers à "mover" or même quand il n'y en a pas, je n'ai pas de message d'erreur et le scripts me renvoit "FIN NORMALE DU SCRIPT".

    Auriez-vous une piste à m'indiquer ou alors pourriez-vous me dire où je me suis trompé svp ?

    Merci d'avance.


    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
     
    #!C:\perl\bin\perl -w
     
    use strict;
    use File::Copy;
     
    my $date=localtime;
     
    print "\n************ $date: DEBUT DU SCRIPT $0  ************\n\n";
     
    my $fromdir="D:/EAIGEF/dis/$ARGV[0]";
    my $todir="//serveur2/$ARGV[2]/$ARGV[1]/$ARGV[0]";
     
    chdir $fromdir;
     
    foreach my $file ( <fic*.txt> )
    {
    	print "Le fichier traite est: $file\n";
    	move($fromdir."/".$file,$todir."/".$file) or die "move: ************ $date: FIN ANORMALE DU SCRIPT $0 **********: $!\n";
    	print "Le fichier $file a ete transfere sur $todir.\n";
    }  
     
    print "\n************ $date: FIN NORMALE DU SCRIPT $0  ************\n";

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $file ( <fic*.txt> ) {
      #...
    }
    Cette boucle parcourt l'ensemble des fichier dont le nom est de la forme "fic*.txt", quand il n'y a pas de tels fichiers, on ne rentre même pas dans le corps de la boucle, move() n'échoue donc pas puisqu'il n'est même pas appelé...

    --
    Jedaï

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 49
    Points : 26
    Points
    26
    Par défaut
    ok, merci bien.
    Comment je peux faire alors pour traiter le cas "fichiers non présents" et avoir un message "FIN ANORMALE DU SCRIPT" avec un arrêt du script ?

  4. #4
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 49
    Points : 26
    Points
    26
    Par défaut
    Alors, pendant ce temps j'ai continué à chercher une solution.
    J'ai ajouté Les lignes suivantes avant la boucle "foreach":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $liste_files=glob ("fic*.txt");
    die ("************ $date: FIN ANORMALE DU SCRIPT $0 **********: $!\n") if (!-e $liste_files);
    Le script fonctionne correctement mais génère toutefois un message: "Use of uninitialized value in -e at c:\bat\dis\move_eai_flow.pl line 17."

    Je ne comprends pas ce que cela signifie ...

    Deuxième interrogation, si dans la boucle foreach je remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $file (<fic*.txt>)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $file (<$liste_files>)
    le script ne fonctionne plus ...

    Tous les eclaircissements sont les bien venus

  5. #5
    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
    Tu n'as pas l'air d'avoir tout compris sur glob()...
    <machin avec des caractères exotiques> est un raccourci pour glob("le même machin"), s'il n'y a pas de caractères non alphanumérique dans <> alors celui ci essaie de lire le fichier dont on vient de lui donner le handle, donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $file (<$liste_files>)
    essaie de lire le handle $list_files, qui n'est pas un handle, d'où problème !

    Par ailleurs glob() est sensible au contexte, si tu lui demande un scalaire, il ne te renvoie qu'un seul nom de fichier, si tu lui demandes un tableau, il te renvoie la liste de tous les fichier correspondant.

    Dans ton cas, tu pourrais donc faire :
    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
    #!C:\perl\bin\perl -w
     
    use strict;
    use File::Copy;
     
    my $date=localtime;
     
    print "\n************ $date: DEBUT DU SCRIPT $0  ************\n\n";
     
    my $fromdir="D:/EAIGEF/dis/$ARGV[0]";
    my $todir="//serveur2/$ARGV[2]/$ARGV[1]/$ARGV[0]";
     
    chdir $fromdir;
     
    my @liste_files = glob('fic*.txt');
    die "************ $date: FIN ANORMALE DU SCRIPT $0 **********: $!\n"
       unless @liste_files;
    foreach my $file ( @liste_files )
    {
       print "Le fichier traite est: $file\n";
       move($fromdir."/".$file,$todir."/".$file) 
          or die "move: ************ $date: FIN ANORMALE DU SCRIPT $0 **********: $!\n";
       print "Le fichier $file a ete transfere sur $todir.\n";
    }  
     
    print "\n************ $date: FIN NORMALE DU SCRIPT $0  ************\n";
    --
    Jedaï

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 49
    Points : 26
    Points
    26
    Par défaut
    Super ! Merci bcp.

    Encore une petite question:
    Est-ce que à la place de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @liste_files = glob('fic*.txt');
    je peux écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @liste_files = glob("$ARGV[2]*.fic");
    ?

    Car en fait les fichier à mover sont transmis en argument du script perl lors de son appel.

  7. #7
    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
    Oui. (Mais je suppose que tu as déjà fais le test depuis... quelle drôle de manie que de poser des questions sur un forum alors qu'un test donne la réponse en un instant )

    --
    Jedaï

  8. #8
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 49
    Points : 26
    Points
    26
    Par défaut
    Merci pour la confirmation (non je n'avais pas fait le test car pendant ce temps là je faisais autre chose !!)
    Je sais que des fois on pose des questions auxquelles on pourrait repondre nous meme en cherchant plus profondemment, mais c'est un probleme d'emploi du temps, on a toujours plusieurs dossiers à traiter simultanement, donc on a pas toujours le temps à consacrer aux recherches ...
    C'est pourquoi il est agreable de faire appel à des specialistes comme vous qui la plupart du temps savez repondre de tete sans avoir à chercher trop longtemps.
    Merci encore et bon courage pour la suite !

  9. #9
    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
    Je comprends bien, toutefois il y a des questions qui le justifie et d'autres non... Par exemple ici, dans le temps que tu as pris pour écrire ta question, tu aurais eu dix fois le temps de taper ceci en console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -e "print glob qq($ARGV[0]*)" machin
    Et de vérifier le résultat.

    --
    Jedaï

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

Discussions similaires

  1. [CS4] message en cas d'absence de fichier (erreur 404)
    Par NoExpert dans le forum Débuter
    Réponses: 3
    Dernier message: 07/04/2010, 23h50
  2. 1.0: absence de fichiers en téléchargement
    Par mga_geo dans le forum IGN API Géoportail
    Réponses: 3
    Dernier message: 21/03/2010, 14h35
  3. Absence de fichiers dans les exemples
    Par mga_geo dans le forum IGN API Géoportail
    Réponses: 11
    Dernier message: 04/03/2010, 13h21
  4. Réponses: 5
    Dernier message: 24/04/2009, 10h16
  5. JVCL Problème absence de fichier
    Par Goundy dans le forum EDI
    Réponses: 2
    Dernier message: 29/11/2007, 20h02

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