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

Web & réseau Delphi Discussion :

Récupérer des fichiers dont on ne connaît pas le nom sur un serveur FTP


Sujet :

Web & réseau Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 29
    Points
    29
    Par défaut Récupérer des fichiers dont on ne connaît pas le nom sur un serveur FTP
    Bonjour

    Je cherche à faire un petit programme qui permet de récupérer des fichiers texte sur un serveur FTP.

    Pour cela je vais utiliser les composants Indy et Delphi 7.

    D'un côté j'ai un logiciel qui envoi des fichiers texte sur ce fameux serveur. Ça c'est fait et ça fonctionne.

    De l'autre côté, je veux faire un logiciel qui va se connecter toutes les minutes (donc utilisation d'un timer) pour voir s'il y a des fichiers et les récupérer. Et par la même occasion, les effacer du serveur. C'est là que j'ai besoin d'aide car je ne trouve pas vraiment ce que je veux.

    Je précise que je ne connais pas le nom des fichiers texte qui sont déposés et le nombre. Pour simplifier on va dire qu'il sont à la racine du serveur.

    Donc j'imagine qu'à la connexion il faut "lister" les fichiers pour avoir leur nom et le nombre de fichiers, et qu'ensuite dans une boucle on fait un "get" pour les rapatrier.

    C'est là que j'aurais besoin des lumières de ceux qui savent faire ou qui savent où trouver les sources.

    Merci.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    un simple tour dans la https://delphi.developpez.com/faq/?p...P-sans-analyse et le "lister" est résolu
    cependant la version d'Indy va certainement être à prendre en compte
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Indy 9 de Delphi 7, cela a du changer un peu avec Indy 10, voir la FAQ si c'est toujours du Indy 9

    avec TNMFTP de Delphi 5, c'était l'évènement OnListItem et la commande Nlist
    avec TIdFTP de Dephi XE2, Indy 10 c'est List directement

    je me suis fait une classe enveloppe TSLTFTP.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    un simple tour dans la https://delphi.developpez.com/faq/?p...P-sans-analyse et le "lister" est résolu
    cependant la version d'Indy va certainement être à prendre en compte
    Oui ça j'ai vu ... mais alors ça m'aide pas du tout ... Je vois pas trop quoi faire avec ça ...

    Je suis un poil débutant ...

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Re,

    c'est vrai cette FAQ n'est pas très claire

    basiquement :
    Déposer un TidFTP
    renseigner les propriétés host, username, password et passive
    déposer un Tmemo // utilisation de memo pour récupérer la liste des fichiers
    déposer un Tbutton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure Tform1.Button1Click(Sender : TObject)
    var i : integer
    begin
    memo1.lines.Clear;
    idftp1.Connect();
    idftp1.List(memo1.lines,'',false); // juste nom fichiers
    for i:=0 to memo1.lines.count-1 do 
        // récupération du fichier dansq c:\temp
        idftp1.get(memo1.lines[i],'c:\temp\'+memo1.lines[i],true,false);
    idftp1.Disconnect; 
    end;
    ce que suggére la faq est simplement de ne pas utiliser memo1.lines de l'instruction list
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure Tform1.Button1Click(Sender : TObject)
    var i : integer
    begin
    memo1.lines.Clear;
    idftp1.Connect();
    idftp1.List(nil); 
    for i:=0 to pred(idftp1.directorylisting.count) do  // idftp1.directorylisting.count-1
       begin
        memo1.lines.add(idftp1.directorylisting[i].fileName); // juste pour montrer 
        // récupération du fichier dansq c:\temp
        idftp1.get(idftp1.directorylisting[i].fileName,'c:\temp\'+idftp1.directorylisting[i].filename,true,false);
      end;
    idftp1.Disconnect; 
    end;



    Bien sûr, créer le composant idftp au runtime, penser à mettre la gestion des erreurs (TIdIOHandler), utiliser la propriété Intercept pour suivre la progression etc... sont des todos possibles
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 29
    Points
    29
    Par défaut
    Ah ben là oui je comprends mieux ...

    Je vais tester cela.

    Et si j'arrive à le faire fonctionner, vous pourrez le mettre dans la FAQ avec comme titre : lister les fichiers d'un serveur FTP et affichage dans un MEMO de la liste

    Merci

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 29
    Points
    29
    Par défaut
    Alors j'ai fait ceci :


    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
     
    procedure TForm1.lister_fichiersClick(Sender: TObject);
    begin
        Try
            with IdFTP1 do
            begin
                 // Connexion au serveur FTP //
                 if not Connected then
                 begin
                      IdFTP1.Host := 'ftpperso.free.fr';
                      IdFTP1.Port := 21;
                      IdFTP1.Username := 'nomduftp';
    	          IdFTP1.Password := 'motdepasse';
                      IdFTP1.Passive := true;
     
                      IdFTP1.Connect;
                      IdFTP1.ChangeDir('/rep1');
                   end;
     
                   memo1.lines.Clear;
     
                   idftp1.List(memo1.lines,'',false);
     
                   label1.caption := ('nombre de fichiers :'+inttostr(memo1.lines.count-1));
     
                   for i:=2 to memo1.lines.count-1 do
                   begin
                       idftp1.get(memo1.lines[i],'c:\test\'+memo1.lines[i],true,false);
                   end;
     
            end;
         Except
            on E: Exception do
              MessageDlg( 'Erreur FTP : ' + E.Message, mtError, [mbOK], 0 );
         End;
         IdFTP1.Disconnect;
    end;
    Sur mon serveur FTP il y a tout un tas de trucs, donc je vais travailler avec un répertoire spécifique nommé rep1, d'où IdFTP1.ChangeDir('/rep1'); pour changer de répertoire.

    Ca fonctionne. J'arrive à afficher la liste des fichiers dans mon mémo mais elle est précédée de . sur la 1ère ligne et de .. sur la 2ème ligne (pour dire que 'on est pas à la racine du serveur je suppose).

    Du coup ma boucle for i:=2 to memo1.lines.count-1 do commence à 2 pour bien commencer au 1er fichier réel.

    Reste plus qu'à effacer après avoir téléchargé, mais ça je sais faire.


    Est ce que par hasard on peut éviter d'avoir les . et .. ???



    Merci Sergio

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 29
    Points
    29
    Par défaut
    Réponse à ma propre question : comment éviter les . et ..

    idftp1.List(memo1.lines,'*.*',false);

    Du coup le code pour se connecter au FTP, lister tous les fichiers présent dans le répertoire choisi, les rapatrier sur le PC dans un répertoire et les supprimer du FTP au fur et à mesure est celui-ci :

    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
     
    procedure TForm1.lister_fichiersClick(Sender: TObject);
    begin
        Try
            with IdFTP1 do
            begin
                 // Connexion au serveur FTP //
                 if not Connected then
                 begin
                      IdFTP1.Host := 'ftpperso.free.fr';
                      IdFTP1.Port := 21;
                      IdFTP1.Username := 'nomdu FTP';
    	          IdFTP1.Password := 'motdepasse';
                      IdFTP1.Passive := true;
     
                      IdFTP1.Connect;
                      IdFTP1.ChangeDir('/rep1'); // changement de répertoire
                   end;
     
                   memo1.lines.Clear;
     
                   idftp1.List(memo1.lines,'*.*',false); // juste nom fichiers
     
                   label1.caption := ('nombre de fichiers :'+inttostr(memo1.lines.count-1));
     
                   for i:=0 to memo1.lines.count-1 do
                   begin
                       idftp1.get(memo1.lines[i],'c:\test\'+memo1.lines[i],true,false);
                       Delete( memo1.lines[i]);   // efface les fichiers sur le FTP
                   end;
            end;
         Except
            on E: Exception do
              MessageDlg( 'Erreur FTP : ' + E.Message, mtError, [mbOK], 0 );
         End;
         IdFTP1.Disconnect;
    end;
    Edit de mon post ...

    le problème des *.* c'est que quand le répertoire sur le FTP ne contient aucun fichier ça plante .... Grrrrrrr !!!!

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 29
    Points
    29
    Par défaut
    Là ça fonctionne et ça ne plante pas lorsque le répertoire sur le FTP ne contient aucun fichier.

    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
    71
    72
    73
    74
    75
    76
    77
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ScktComp, IdBaseComponent, IdComponent,
      IdTCPConnection, IdTCPClient, IdFTP;
     
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        lister_fichiers: TButton;
        Label1: TLabel;
        IdFTP1: TIdFTP;
     
        procedure lister_fichiersClick(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      APath : string;
      i : integer;
     
    implementation
     
    {$R *.dfm}
     
     
    ////////////////////////////////////////////////////////////////////////////////
    procedure TForm1.lister_fichiersClick(Sender: TObject);
    begin
        Try
            with IdFTP1 do
            begin
                 // Connexion au serveur FTP //
                 if not Connected then
                 begin
                      IdFTP1.Host := 'ftpperso.free.fr';
                      IdFTP1.Port := 21;
                      IdFTP1.Username := 'nomduFTP';
    	          IdFTP1.Password := 'motdepasse';
                      IdFTP1.Passive := true;
     
                      IdFTP1.Connect;
                      IdFTP1.ChangeDir('/rep1');
                   end;
     
                   memo1.lines.Clear;
     
                   idftp1.List(memo1.lines,'',false); // juste nom fichiers
     
                   label1.caption := ('nombre de fichiers :'+inttostr(memo1.lines.count - 2));
     
                   if (i >= 2) then      // on télécharge que s'il y a des fichiers ....
                   begin
                      for i:=2 to memo1.lines.count-1 do
                      begin
                       idftp1.get(memo1.lines[i],'c:\test\'+memo1.lines[i],true,false);
                       Delete( memo1.lines[i]);   // efface les fichiers sur le FTP
                      end;
                   end;
     
            end;
         Except
            on E: Exception do
              MessageDlg( 'Erreur FTP : ' + E.Message, mtError, [mbOK], 0 );
         End;
         IdFTP1.Disconnect;
    end;
     
    end.

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    Je ne suis pas très partisan de ce saut de 2 lignes pour éviter les répertoires qu'il peut y en avoir d'autres ! Le fait d'utiliser DirectoryListing semble déjà éliminer . et ..

    Pour ce qui est d'éliminer les répertoires
    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
     
    uses ... ,idftplist;
     
    procedure TFormftp.Button1Click(Sender: TObject);
    var i : integer;
    begin
    memo1.Lines.Clear;
    memo1.Lines.Add('Version '+idftp1.Version);
    with idftp1 do
     begin
      Connect;
      Changedir('/tutoriels/Delphi/FMX/Listes/RechercherDans');
      List(nil);
      for I := 0 to Pred(DirectoryListing.Count) do
        if DirectoryListing[i].ItemType=TidDirItemType.ditFile then
          Memo1.Lines.Add(DirectoryListing[i].FileName);
      Disconnect;
     end;
    end;
    donne
    Version 10.6.2.5366
    FMXListViewR.azw
    FMXListViewR.epub
    FMXListViewR.mobi
    FMXListViewR.pdf
    FMXListViewR.xml
    FMXListViewR.zip
    index.php
    où sans le test sur l'itemtype j'obtiens (en rouge les répertoires)
    Version 10.6.2.5366
    /tutoriels/Delphi/FMX/Listes/RechercherDans
    /tutoriels/Delphi/FMX/Listes

    FMXListViewR.azw
    FMXListViewR.epub
    FMXListViewR.mobi
    FMXListViewR.pdf
    FMXListViewR.xml
    FMXListViewR.zip
    fichiers
    images

    index.php
    fonctionne aussi avec la version 9
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 54
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Je ne suis pas très partisan de ce saut de 2 lignes pour éviter les répertoires qu'il peut y en avoir d'autres ! Le fait d'utiliser DirectoryListing semble déjà éliminer . et ..
    Ok. Merci je vais essayer.


Discussions similaires

  1. Verifier l'existance d'un fichier dont je ne connais pas le nom
    Par Fazerting dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 05/07/2017, 15h12
  2. Réponses: 3
    Dernier message: 03/12/2009, 15h45
  3. Réponses: 4
    Dernier message: 28/04/2009, 13h48
  4. Réponses: 6
    Dernier message: 14/03/2008, 12h54
  5. Réponses: 2
    Dernier message: 05/10/2006, 15h58

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