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

Free Pascal Discussion :

Problème pour lister les fichiers d'un serveur distant [Free Pascal]


Sujet :

Free Pascal

  1. #1
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Points : 2 053
    Points
    2 053
    Par défaut Problème pour lister les fichiers d'un serveur distant
    Bonjour,

    J'ai un phénomène bizarre avec une fonction récursive chargée de lister tous les fichiers images .jpg. A ses débuts elle donnait satisfaction mais depuis l'arborescence à pris du ventre, j'ai environ 8000 images à lister et j'ai constaté que le nombre d'images trouvées par cette fonction n'était plus jamais le même.

    J'utilise FPC 2.7.1 svn et Lazarus 1.1 svn et synapse svn 184 ( mais j'ai des problèmes similaires avec indy )

    Il y-a un truc aléatoire qui fait que le changement de répertoire échoue parfois de manière tout à fait aléatoire. Seul if not ... permet de les détecter, elles ne provoquent aucune exception. Mais lors-quelles surviennent la fonction getcurrentdir au lieu de me renvoyer un honorable nom de répertoire renvoie:

    "250 CWD command successful" ou beaucoup plus rarement "229 transfert complete"

    Un second appel de getcurrentdir sitôt après renverra bien un répertoire.

    Ca ne vient pas d'une interruption de transfert, le graphe de connexion est parfaitement régulier du début à la fin.

    Je joins ci-dessous la fonction concernée et un aperçu des erreurs ( Il s'en produit entre 1 et 5 par usage de la fonction ). Le "229 transfert complete" je ne l'ai eu q'une fois sur le point 0 ( Tout en haut ) sur plusieurs dizaines d'essais.

    Je n'arrive pas à comprendre ce qui se passe.

    La fonction ( Temps d'exécution env. 7 Mins pour env. 8000 fichiers, taux de transfert 3 Ko/s Up 12/6 Kos Down.)

    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
    69
    70
     
    procedure TFBouq_Select_01.Get_Liste_Images_Ftp ( Ftp:TFTPSend; Start_Dir:String );
    var
      i:integer;
      Restart_Dir, Curr_file:String;
      LFoldersToExplore:TSTringList;
      IsConnect:Boolean;
     
      function Restore_Full_Path(const cPath : string) : string;
      begin // Recomposer le chemin complet d'un répertoire.
        if Length(cPath)>1 then begin
          if cPath[Length(cPath)] <> '/' then Result := cPath + '/'
          else Result := cPath;
        end
          else Result := '/';
      end;
     
    begin
      with FTP do begin
        try
          if not ChangeWorkingDir(Start_Dir) then Memo_Ftp.Lines.Add('Echec 0 de: '+GetCurrentDir+' vers: '+Start_Dir);
          try
            List(Start_Dir, False); //Lister le répertoire en cours.
          finally
            NoOp;  // Time out ?
          end;
        except
          on E:Exception do begin
            showmessage(E.Message);
            Logout;
            exit;
          end;
     
        end;
        LFoldersToExplore := TStringList.Create;
        try
     
          for i:= 0 to FtpList.Count-1 do begin
     
            if not (FtpList.Items[i].Directory )then begin   // Si ce n'est pas un répertoire lister les fichiers.
              Curr_File:=Restore_Full_Path(Start_Dir)+FtpList.Items[i].FileName; // Full path name fichier sur le FTP.
     
              If extractFileext(Curr_File)='.jpg' then begin  // Ne conserver que les images jpg.
                Memo_Ftp.Lines.Add(Curr_file); // Pour info visuelle.
              end;
            end
            else // Répertoire, l' ajouter à la liste à traiter.
              if (FtpList.Items[i].FileName<>'.') and (FtpList.Items[i].FileName<>'..') then begin
                 LFoldersToExplore.Add(Restore_Full_Path(Start_Dir)+FtpList.Items[i].FileName);
    Memo_Ftp.Lines.add('Est dans 1: '+GetCurrentDir);
    Memo_Ftp.Lines.add('Veut trouver 1: '+Restore_Full_Path(Start_Dir)+FtpList.Items[i].FileName);
                 if not ChangeWorkingDir(Restore_Full_Path(Start_Dir)+FtpList.Items[i].FileName) then
                    Memo_Ftp.Lines.Add('Echec 1 de : '+GetCurrentDir+' vers: '+Restore_Full_Path(Start_Dir)+FtpList.Items[i].FileName);
    Memo_Ftp.Lines.add('A trouvé 1: '+GetCurrentDir);
              end;
          end; // Fin de for i:= 0 to FtpList.Items.Count-1
     
          for i:=0 to LFoldersToExplore.Count-1 do begin  // Exploration des dossiers.
            Get_Liste_Images_Ftp(ftp, LFoldersToExplore[i] );
    Memo_Ftp.Lines.add('Est dans 2: '+GetCurrentDir);
    Memo_Ftp.Lines.add('Veut trouver 2: '+Start_Dir);
            if not ChangeWorkingDir(Start_Dir) then Memo_Ftp.Lines.Add('Echec 2 de : '+GetCurrentDir+' ver: '+Start_Dir);
    Memo_Ftp.Lines.add('A trouvé 2: '+GetCurrentDir);
          end;
        finally
          LFoldersToExplore.Free; {Libérer la liste}
        end;
      end;
      Application.ProcessMessages;
    end;
    Les erreurs ( Tous les résultats mentionnés en face de 'a trouvé' et 'est dans' sont fournis par getcurrentdir.)

    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
     
    ---- Cas 1 listage des répertoires ----
    Est dans 1: /vues/journaux/g_civil
    Veut trouver 1: /vues/journaux/g_trotter
    ----- Ne trouve pas le répertoire, getcurrentdir renvoie une valeur fantaisiste -----
    Echec 1 de : 250 CWD command successful vers: /vues/journaux/g_trotter
    ----- Mais le getcurrentdir qui suit aussitôt est correct -----
    A trouvé 1: /vues/journaux/g_trotter
    Est dans 1: /vues/journaux/g_trotter
    Veut trouver 1: /vues/journaux/histoire
    A trouvé 1: 250 CWD command successful
    Est dans 1: /vues/journaux/histoire
    Veut trouver 1: /vues/journaux/illustr
    A trouvé 1: 250 CWD command successful
    Est dans 1: /vues/journaux/illustr
    Veut trouver 1: /vues/journaux/jeun_cine
    A trouvé 1: 250 CWD command successful
    -------- Etc ... Ici l''erreur est sans conséquence -----
     
    ---- Mais ici même erreur au même endroit et le répertoire /vues/papier/factures/50_99 sera ignoré par la suite ---
    Veut trouver 1: /vues/papier/factures/chatelet_75
    Echec 1 de : 250 CWD command successful vers: /vues/papier/factures/chatelet_75
    A trouvé 1: /vues/papier/factures/chatelet_75
    Est dans 2: /vues/papier/factures/50_99
    Veut trouver 2: /vues/papier/factures
    A trouvé 2: /vues/papier/factures
     
    ------ Cas 2 listage des fichiers d''un répertoire ------
    /vues/journaux/stars/cinerevelation/1957/t4/C_REVEL_195th1.jpg
    Est dans 2: /vues/journaux/stars/cinerevelation/1957/t4
    Veut trouver 2: /vues/journaux/stars/cinerevelation/1957
    A trouvé 2: /vues/journaux/stars/cinerevelation/1957
    Est dans 2: /vues/journaux/stars/cinerevelation/1957
    Veut trouver 2: /vues/journaux/stars/cinerevelation
    A trouvé 2: /vues/journaux/stars/cinerevelation
    ----------- Ici changework directory échoue et getcurrentdir renvoie une valeur fantaisite ----
    Echec 0 de: 250 CWD command successful vers: /vues/journaux/stars/cinerevelation/1958 
    ----------- Mais le second getcurrentdir qui suit aussitôt renvoie la valeur correcte -------
    Est dans 2: /vues/journaux/stars/cinerevelation/1958
    ----------- Tout le répertoire ci-dessus sera ignoré ---------
    Veut trouver 2: /vues/journaux/stars/cinerevelation
    A trouvé 2: /vues/journaux/stars/cinerevelation
    /vues/journaux/stars/cinerevelation/1959/C_REVEL_249.jpg
    /vues/journaux/stars/cinerevelation/1959/C_REVEL_249th1.jpg
     
    ---------- Meme chose, le répertoire /vues/bd/dargaud sera ignoré -----
    /vues/bd/dargaud/pilote/PILREL_56_01.jpg
    Est dans 2: /vues/bd/dargaud/pilote
    Veut trouver 2: /vues/bd/dargaud
    Echec 2 de : 250 CWD command successful ver: /vues/bd/dargaud
    A trouvé 2: /vues/bd/dargaud
    Est dans 2: /vues/bd/dargaud/sf
    Veut trouver 2: /vues/bd/dargaud
    A trouvé 2: /vues/bd/dargaud

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut
    Salut,

    Vu comment tu racontes ça, on dirait une perte de connexion logique...

    J'ai noté une variable inutilisée, et avec un nom pareil, IsConnect: Boolean;, ça donne envie de l'utiliser juste après un ChangeDir,
    suivie d'un test sur l'existence de la nouvelle cible (If IsDirectory ou qqchse comm' ça).
    Nan ?

    Faudrait voir l'aide du composant FTP.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Points : 2 053
    Points
    2 053
    Par défaut
    Vu comment tu racontes ça, on dirait une perte de connexion logique...
    En principe quand il y-a perte de connexion tout s'arrête ce qui n'est pas le cas ici. Mais 'perte de connexion logique'. Est-ce différent de ce qui se passe lorsqu'on prend un time out ou une coupure du serveur ?

    J'ai noté une variable inutilisée, et avec un nom pareil, IsConnect: Boolean;
    C'est un vestige oublié qui existe dans ma version 'indy' elle n'a aucune utilité dans la version synapse.

    Faudrait voir l'aide du composant FTP.
    Ca c'est l'éternel problème. Trouver des aides ou des exemples acceptables c'est la quête du graal.

    Pour synapse l'auteur à fait l'effort de joindre une liste complète des fonctions et procédures et des exemples mais malheureusement ses exemples utilisent les socks et les threads et je ne suis pas assez avancé pour comprendre et encore moins utiliser.

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut
    Yep !

    Bon, ben si tu veux pas de ma variable , te reste plus qu'à tenter comme ça :
    après un ChangeDir tu testes l'existence de la nouvelle cible, avec If IsDirectory ou qqchse comm' ça.
    Ça devrait réactiver le canal de communication.

    Et je me disais bien que j'avais déjà vu ces messages ("250 CWD command successful") : ça vient de me revenir, je les voyais passer dans le client Filezilla, lors du parcours (à la souris) de l'arborescence du serveur.
    Ça le faisait en changeant de dossier, ce qui ressemble à ton cas.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Points : 2 053
    Points
    2 053
    Par défaut
    après un ChangeDir tu testes l'existence de la nouvelle cible, avec If IsDirectory ou qqchse comm' ça.
    C'est justement ça qui sème le bronx, que ce soit Indy ou synapse ces fonctions renvoient un 'true' alors que le répertoire n'est pas encore vraiment atteint et autres joyeusetés diverses.


    Et je me disais bien que j'avais déjà vu ces messages ("250 CWD command successful")
    Oui, le cycle complet c'est ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    250 CWD command successful
    227 Entering Passive Mode (87,98,251,79,172,54).
    150 Opening BINARY mode data connection for file list
    226 Transfer complete
    Et le 'true' ne devrait être mis qu'après 'transfert complete' ce qui n'est pas le cas.
    J'ai fini pas comprendre que ça vient du fait que le FTP et la boucle récursive ne sont pas synchronisés, la fonction récursive gave le FTP comme une oie et au bout d'un certain temps il rend son tablier.
    J'ai beau chercher je n'ai pas trouvé d'instruction qui récupère directement l'état en cours du FTP ( 227, 150, etc ) pour placer une attente dans la fonction. Si quelqu'un connaît ça pour Indy ou Synapse ?

    Par chance il existe aussi le composant lNet, l'accès a tous les events du FTP y est natif, il faut tout faire à la main mais on en fait ce qu'on veut et mon bazar fonctionne enfin.

  6. #6
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 719
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 719
    Points : 15 105
    Points
    15 105
    Par défaut
    Citation Envoyé par mm_71 Voir le message
    (...) et mon bazar fonctionne enfin.
    Bien joué

    Pense à cliquer sur , en bas de ton premier post, merci !
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  7. #7
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2012
    Messages
    1 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 035
    Points : 2 053
    Points
    2 053
    Par défaut
    Il manque une option 'à moitié' résolu car je n'ai toujours pas trouvé de solution pour Indy et synapse. Mais comme ce sont des composants Lazarus je rouvrirai un fil la bas.

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

Discussions similaires

  1. Problème pour lister les fichiers d'in JAR
    Par Micke7 dans le forum Langage
    Réponses: 4
    Dernier message: 25/02/2011, 11h21
  2. Réponses: 1
    Dernier message: 25/02/2009, 09h44
  3. lister les fichiers d'un serveur ftp
    Par Mangacker dans le forum C++Builder
    Réponses: 46
    Dernier message: 12/04/2008, 14h48
  4. Réponses: 2
    Dernier message: 13/10/2007, 14h30
  5. Problème pour lister les fichiers d'un répertoire
    Par Vitaly dans le forum Applets
    Réponses: 17
    Dernier message: 21/08/2007, 00h49

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