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 :

Problème avec FTP et liste de fichiers


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Problème avec FTP et liste de fichiers
    Bonjour,

    je rencontre un problème sur l'exécution d'un script PERL depuis que la plateforme FTP a été migrée de :
    Windows 2000 SP4 +IIS 6.5 vers Windows 2008 SP2 + IIS 7.5

    Le script se connecte à un serveur FTP, et doit récupérer des fichiers (XML) sur un répertoire local.
    A priori, la connexion au FTP se passe bien,
    Mais au moment de lister les fichiers du répertoire courant, le script "ne trouve aucun fichiers" (alors qu'ils sont bien présents) et ne les rapatrie donc pas ...

    Et ce, depuis la migration de plateforme.

    (voir Code et Log en fin de message)


    La commande "parse_dir" semble être en cause ...

    Le même script exécuté sur un serveur FTP Free, parvient, après connexion au serveur FTP, à lister les fichiers dans le répertoire courant.

    Avez vous déjà rencontré de ce problème ?
    Si oui, comment l'avez vous résolu ?
    Existe-t-il une fonction équivalente à "parse_dir" ou un autre moyen de lister les fichiers ?

    Je précise que je ne suis pas un pro du PERL ...

    Merci pour vos retours .
    Philoo



    **************************************************
    Le code utilisé est le suivant :
    **************************************************
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    use Net::FTP;
    use File::Listing qw(parse_dir);
    use File::Compare;
    use File::stat;
     
    $BATCH = "BATCH_FTP";
    require("SMP_common.pm") || die("SMP_common.pm n'a pas pu être ouvert - $!");
     
    my $ERROR = 0;
    log_start($LOGFILE);
     
    my $nombre_tentatives_max = $CONFIG->{$BATCH}{MAX_TENTATIVES};
    my $nb_fichier_tot = 0;
    my $nb_fichier_ok = 0;
     
    log_append("1) Connexion au serveur FTP ".$CONFIG->{$BATCH}{"FTP_SERVER"}."...");
     
    # Ouverture de la connextion FTP
    $ftp = Net::FTP->new($CONFIG->{$BATCH}{"FTP_SERVER"});
     
    if(!$ftp) {
      log_append("   => Erreur de connexion au site : \n\n$@\n");
      $ERROR = 1;
    } else {
     
      if(!$ftp->login($CONFIG->{$BATCH}{"FTP_LOGIN"}, $CONFIG->{$BATCH}{"FTP_PASSWORD"})) {
        log_append("   => Erreur d'identification FTP (Login : ".$CONFIG->{$BATCH}{"FTP_LOGIN"}.")");
        $ERROR = 1;
      } else {
     
        $ftp->binary();
     
        log_append("2) Exploration du répertoire distant...");
     
        # Liste des fichiers dans le répertoire distant
        #@ls = $ftp->dir();
         @ls = $ftp->ls('-lR');
     
          log_append("2-1) Contenu Répertoire distant : " .@ls );
     
     
        if (!@ls) {
          log_append("   => Répertoire vide");
        } else {
     
          log_append("3) Transfert des fichiers XML...");
     
          # Log passage dans la boucle
          log_append("3-1) Transfert des fichiers XML - Log avant FOR EACH ...");
     
          # Rapatriement des fichiers XML présents sur le serveur FTP
          foreach my $fichier (parse_dir(\@ls)) {
     
              #  Log passage dans la boucle
              log_append("3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...");
     
              .......
     
            }
     
          #Log passage dans la boucle
          log_append("3-3) Transfert des fichiers XML - Log sortie boucle FOR EACH ...");
     
        }
     
        log_append("4) Fermeture de la connexion FTP");
        $ftp->quit();
    **************************************************
    Le fichier de Log obtenu est le suivant
    **************************************************

    08:57:58 : Début de traitement
    08:57:58 : 1) Connexion au serveur FTP XXXXX...
    08:57:58 : 2) Exploration du répertoire distant...
    08:57:58 : 2-1) Contenu Répertoire distant : 4
    08:57:58 : 3) Transfert des fichiers XML...
    08:57:58 : 3-1) Transfert des fichiers XML - Log avant FOR EACH ...
    08:57:58 : 3-3) Transfert des fichiers XML - Log sortie boucle FOR EACH ...
    08:57:58 : 4) Fermeture de la connexion FTP

  2. #2
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Salut !

    Si tu essaies ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    log_append("2-1) Contenu Répertoire distant : @ls" );
    Ton log devrait contenir le retour complet du ls, et non le nombre d'entrées. Ca devrait t'aider à voir ou est le problème.

    @+
    Mr6

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    08:57:58 : 2-1) Contenu Répertoire distant : 4
    => Il y a 4 fichiers dans ton répertoire distant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $fichier (parse_dir(\@ls)) {
    A ce niveau, je ne te suis plus. Pourquoi ne pas lister tout simplement ton répertoire ? Car @ls correspond au répertoire distant et non local.

  4. #4
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Merci pour l'info MR6

    Djibril,

    justement je voudrais lister le contenu de mon répertoire distant (celui du ftp) pour en récupérer le contenu.
    Est-ce que la syntaxe est correct ? ou bien je dois changer quelquechose ?
    Merci

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Ta commande est bonne. As tu testé le code de Mr6 pour voir ce qu'il t'affiche ?

  6. #6
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    J'ai ajouté la commande de Mr6,
    voici ce que cela donne :

    14:02:32 : Début de traitement
    14:02:32 : 1) Connexion au serveur FTP XXXXXX...
    14:02:32 : 2) Exploration du répertoire distant...
    14:02:32 : 2-1) Contenu Répertoire distant : 4
    14:02:32 : 2-2) Contenu Répertoire distant : 03-09-2006 12:49PM 7995 sannxxxxxxv1.dtd 04-14-2010 01:31AM 5907 XXXXXFRANCE_1_20_1_1642.xml 04-14-2010 01:31AM 494623 XXXXXFRANCE_2_27_1_2891.xml 04-14-2010 01:31AM 645771 XXXXXFRANCE_2_27_1_2892.xml
    14:02:32 : 3) Transfert des fichiers XML...
    14:02:32 : 3-1) Transfert des fichiers XML - Log avant FOR EACH ...
    14:02:32 : 3-3) Transfert des fichiers XML - Log sortie boucle FOR EACH ...
    14:02:32 : 4) Fermeture de la connexion FTP
    14:02:32 : 5) Statistiques :
    14:02:32 : Aucun fichier n'est présent sur le serveur FTP
    14:02:32 : Fin de traitement


    --> il y a donc bien les 4 fichiers dans le répertoire distant, sur le FTP, mais ils ne sont pas listés ...
    Une (ou plusieurs ..) idées ??

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    essaye alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $fichier (parse_dir(@ls)) {
    J'ai enlevé le déférencement.

  8. #8
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    en testant sur un FTP Free, le script ne rentre pas dans la boucle FOREACH :



    15:06:32 : Dbut de traitement
    15:06:32 : 1) Connexion au serveur FTP XXXXXXX...
    15:06:32 : 2) Exploration du rpertoire distant...
    15:06:32 : 2-1) Contenu Rpertoire distant : 22
    15:06:32 : 2-2) Contenu Rpertoire distant : [Liste des fichiers]
    15:06:32 : 3) Transfert des fichiers XML...
    15:06:32 : 3-1) Transfert des fichiers XML - Log avant FOR EACH ...
    15:06:32 : 3-3) Transfert des fichiers XML - Log sortie boucle FOR EACH ...
    15:06:32 : 4) Fermeture de la connexion FTP
    15:06:32 : 5) Statistiques :
    15:06:32 : Aucun fichier n'est prsent sur le serveur FTP
    15:06:32 : Fin de traitement

  9. #9
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bon, je pense qu'il rentre bien dans le foreach. Le problème est juste que parse_dir parse mal le résultat et ne retourne rien.

    Je pense que tu n'as pas besoin d'utiliser parse_dir.

    Je te conseil ceci :
    - tu fais un ls normal
    et ensuite tu lis @ls
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $fichier ( @ls ) {
    et ça devrait fonctionner

  10. #10
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Alors,
    en testant sur un FTP Free, a priori le listing des fichiers se fait :

    15:54:20 : Dbut de traitement
    15:54:20 : 1) Connexion au serveur FTP XXXXX...
    15:54:20 : 2) Exploration du rpertoire distant...
    15:54:20 : 2-1) Contenu Rpertoire distant : 22
    15:54:20 : 2-2) Contenu Rpertoire distant : . .. [listes des fichiers]
    15:54:20 : 3) Transfert des fichiers XML...
    15:54:20 : 3-1) Transfert des fichiers XML - Log avant FOR EACH ...
    15:54:20 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    15:54:20 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    15:54:20 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    15:54:20 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    15:54:20 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    15:54:20 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    15:54:20 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    .....
    15:54:20 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    15:54:20 : 3-3) Transfert des fichiers XML - Log sortie boucle FOR EACH ...
    15:54:20 : 4) Fermeture de la connexion FTP
    15:54:20 : 5) Statistiques :
    15:54:20 : Aucun fichier n'est prsent sur le serveur FTP
    15:54:20 : Fin de traitement


    Le souci est maintenant le suivant :
    je dois trouver les fichier XML et les traiter
    Or je sais qu'il y a un ficheir XML parmi les ficheirs présent, et aucun traitement n'est effectué (pas loggé)
    Je pense qu'avec les modifications que tu m'as donnée, il doit falloir changer légèrement mon code..

    Pour info, mon code, dans la boucle foreach, de détection d'un xml est le suivant :

    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
     
    @ls = $ftp->ls();
     
    foreach my $fichier (@ls) {
     
    	      # Log passage dans la boucle
    	      log_append("3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...");
     
            # Détermination des propriétés du fichier à récupérer
            my($nom_fichier_distant, $type, $taille_fichier_distant, $mtime, $mode) = @$fichier;
     
     
            # Si ce n'est pas un XML, on passe au suivant
            next if ($nom_fichier_distant !~/\.xml$/ && $nom_fichier_distant !~/\.XML$/);
     
            # On compte le nombre total de fichiers XML
            $nb_fichier_tot++;
     
            log_append("\n--------------------- ".$nom_fichier_distant." ---------------------");
     
            my $taille_fichier_recupere = -1;
            my $nombre_tentatives = 0;
     
            log_append("   Transfert du fichier '".$nom_fichier_distant."'...");
     
    ...    
    }
    Je pense que le test sur le fchuier XMl n'est plus valable ..
    comment dois-je le modifier ?
    Merci bien

  11. #11
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Essaye ce 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
    foreach my $nom_fichier_distant ( sort @ls ) {
     
    	      # Log passage dans la boucle
    	      log_append("3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...");
     
            # Si ce n'est pas un XML, on passe au suivant
            if ( $nom_fichier_distant !~ /\.xml$/i ) {
    	       log_append("Fichier $fichier non traite");
    	       next;
            }
     
            # On compte le nombre total de fichiers XML
            $nb_fichier_tot++;
     
    	      log_append("Fichier : $fichier");
            log_append( "Taille : " .$ftp->size($nom_fichier_distant) );
     
            my $taille_fichier_recupere = -1;
            my $nombre_tentatives = 0;
     
            log_append("   Transfert du fichier '".$nom_fichier_distant."'...");
     
    # ...    
    }

  12. #12
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    avec ton code, y a t-il toujours moyen de récupérer les propriétés du fichiers comme je le faisais avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    # Détermination des propriétés du fichier à récupérer
    my($nom_fichier_distant, $type, $taille_fichier_distant, $mtime, $mode) = @$fichier;
    Car j'ai besoin de ses propriété pour la suite ...
    Merci bien !

  13. #13
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Peux tu déjà tester le code ci-dessus et me dire si ça fonctionne et nous afficher le résultat.
    Ensuite, de quelle information as tu besoin sur les fichiers distant ?

  14. #14
    Candidat au Club
    Inscrit en
    Août 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    bon, je m'en suis sorti au final !

    Et ton code fonctionne !

    voici les fichiers de log résultat :


    17:35:10 : Dbut de traitement
    17:35:10 : 1) Connexion au serveur FTP XXXXX...
    17:35:10 : 2) Exploration du rpertoire distant...
    17:35:10 : 2-1) Contenu Rpertoire distant : 22
    17:35:10 : 2-2) Contenu Rpertoire distant : . .. [liste de fichiers]
    17:35:10 : 3) Transfert des fichiers XML...
    17:35:10 : 3-1) Transfert des fichiers XML - Log avant FOR EACH ...
    17:35:10 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    17:35:10 : Fichier . non traite
    17:35:10 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    17:35:10 : Fichier .. non traite
    17:35:10 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    17:35:10 : Fichier XXXXXX01.rar non traite
    17:35:10 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    17:35:10 : Fichier XXXXXX06.rar non traite
    17:35:10 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    17:35:10 : Fichier XXXX non traite
    17:35:10 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    17:35:10 : Fichier XXXXX.htm non traite
    ...
    17:35:10 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    17:35:10 :
    --------------------- document.xml ---------------------
    17:35:10 : Fichier : document.xml
    17:35:11 : Taille : 745
    17:35:11 : Transfert du fichier 'document.xml'...
    17:35:11 : => Fichier correctement transfr en 1 tentative(s)
    17:35:11 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    17:35:11 : Fichier underconstruction.bmp non traite
    17:35:11 : 3-2) Transfert des fichiers XML - Log dans boucle FOR EACH ...
    17:35:11 : Fichier XXXXXX.txt non traite
    ....
    17:35:11 : 3-3) Transfert des fichiers XML - Log sortie boucle FOR EACH ...
    17:35:11 : 4) Fermeture de la connexion FTP
    17:35:11 : 5) Statistiques :
    17:35:11 : Fichiers XML prsents sur le serveur : 1
    17:35:11 : Fichiers XML transfrs en local : 1
    17:35:11 : Fin de traitement



    est ce que tu veux le code final qui semble fonctionner ?

    Merci pour ton (votre) aide !

  15. #15
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    . N'oublie pas de mettre ton code en résolu.

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

Discussions similaires

  1. Net::FTP , Problème avec la fonction list
    Par Jeremy0201 dans le forum Modules
    Réponses: 4
    Dernier message: 06/09/2008, 22h48
  2. Problème avec FTP.list
    Par Didier L dans le forum Delphi
    Réponses: 4
    Dernier message: 29/09/2006, 13h32
  3. Réponses: 2
    Dernier message: 10/05/2005, 10h58
  4. Réponses: 22
    Dernier message: 29/01/2005, 11h29

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