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

Lazarus Pascal Discussion :

Listing dossiers distants en SSH


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de sematimo
    Profil pro
    Inscrit en
    Février 2009
    Messages
    335
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 335
    Par défaut Listing dossiers distants en SSH
    Bonjour à tous
    j'utilise la librairie tgputtysftp pour me connecter en ssh
    Pour lister un dossier, pas de problème avec listdir, mais je voudrai aussi les sous dossiers.
    J'ai essayé de façon récursive avec se code mais ça ne marche pas:
    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
    function TForm1.Listingdir(const names:Pfxp_names): boolean;
    var
      i: integer;
    begin
      for i := 0 to names.nnames - 1 do
        begin
        if (Utf8ToString(names.names[i].filename)= '.') or (Utf8ToString(names.names[i].filename)= '..') then continue;
       begin
       if names.names[i].attrs.permissions and $F000=$4000 then
       begin
       Listbox1.Items.add(Utf8ToString(names.names[i].filename));
      racine:=racine+'/'+Utf8ToString(names.names[i].filename);
     sftp.ChangeDir(racine);
           sftp.ListDir(racine);// relance la fonction avec onlisting=listingdir
           end;
            end;
           end;
       end;
    avec:
    var
    racine:string;//variable globale

    SFTP.OnListing := Listingdir;
    racine:='./';
    sftp.Listdir(racine);

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Bonjour,

    Dans la première ligne de ta boucle il y a une faute. Combien d'autres fautes ailleurs, moins visibles, d'autant plus qu'on ne sait pas ce qu'est Pfxp_names ?

    Ta fonction, présentée un peu mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function TForm1.Listingdir(const names: Pfxp_names): boolean;
    var
      i: integer;
    begin
      for i := 0 to names.nnames - 1 do begin
        if (Utf8ToString(names.names[i].filename)= '.') or (Utf8ToString(names.names[i].filename)= '..') then continue;
        if names.names[i].attrs.permissions and $F000=$4000 then begin
          Listbox1.Items.add(Utf8ToString(names.names[i].filename));
          racine:=racine+'/'+Utf8ToString(names.names[i].filename);
          sftp.ChangeDir(racine);
          sftp.ListDir(racine);// relance la fonction avec onlisting=listingdir
        end;
      end;
    end;
    Il te reste à la blinder de log(racine); avant et après le ChangeDir pour voir ce qui ne va pas et dont tu ne nous parles pas et encore une fois, ça ne marche pas N'EST PAS un message d'erreur valide,

  3. #3
    Membre éclairé
    Avatar de sematimo
    Profil pro
    Inscrit en
    Février 2009
    Messages
    335
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 335
    Par défaut
    Je vais essayer de te donner quelques explications, apparemment personne n'a utilisé cette librairie avec Lazarus.

    Il n'y a pas d'erreur à la 1ère ligne de la boucle.
    Pfxp_names est le résultat renvoyé par sftp.listdir.
    Pfxp_names contient 2 variables :
    names.names[x].filemane qui est le nom des items trouvés par sftp.listdir
    et names.nnames qui contient le nombre d'items trouvés.

    sftp.listdir est associé à la fonction Listingdir(const names: Pfxp_names).
    Chaque fois que sftp.listdir est executé, la fonction est lancée.

    Bon, j'ai modifié un peu les codes et maintenant j'affiche les noms des répertoires et sous-répertoires.
    Mais je n'arrive pas à afficher le chemin complet.

    Je vous mets le projet complet en pièce jointe:
    test listing sftp.zip

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Citation Envoyé par sematimo Voir le message
    Il n'y a pas d'erreur à la 1ère ligne de la boucler
    et names.nnames qui contient le nombre d'items trouvés.
    D'accord, il n'y a pas d'erreur, donc il n'y aucune lisibilité, aucune compréhension des choses mal lues pour ceux qui sont extérieurs au projet.
    Ce names.nnames tu ne pouvais pas l'appeler names.NamesCount par exemple ? Ça aurait été plus parlant.

    Citation Envoyé par sematimo Voir le message
    Bon, j'ai modifié un peu les codes et maintenant j'affiche les noms des répertoires et sous-répertoires.
    Mais je n'arrive pas à afficher le chemin complet.

    Je vous mets le projet complet en pièce jointe:
    test listing sftp.zip
    Pas sûr que beaucoup de gens passent du temps à télécharger puis dézipper puis essayer de comprendre ce qui coince, il aurait été plus simple et plus efficace de montrer le code modifié, les résultats renvoyés et les résultats attendus.

  5. #5
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjour,

    Citation Envoyé par sematimo Voir le message
    Bon, j'ai modifié un peu les code et maintenant j'affiche les noms des répertoires et sous-répertoires.
    Mais je n'arrive pas à afficher le chemin complet.
    Intuitivement, je dirais que le chemin complet, c'est racine+PathSeparator+répertoire+PathSeparator+sous-répertoire, non ?

    bb84000

  6. #6
    Membre éclairé
    Avatar de sematimo
    Profil pro
    Inscrit en
    Février 2009
    Messages
    335
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 335
    Par défaut
    Bonjour BB84000
    j'ai déjà essayé avec ce que tu dis, ça fonctionne en partie, j'affiche racine avec un showmessage, le chemin a l'air correct mais pourtant ça coince avec maintenant un message "No such file or directory".
    Pour répondre à Jipété, je ne peux pas renommer names.nnames, cette variable est dans le fichier passe de la librairie.
    Voici le code complet:
    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    unit Unit1;
     
    interface
     
    {$POINTERMATH ON}
     
    uses
      Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ComCtrls, tgputtylib, tgputtysftp;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        Button1:    TButton;
        Button_connect: TButton;
        Label1:     TLabel;
        Label2:     TLabel;
        Label3:     TLabel;
        Label4:     TLabel;
        edPort:     TEdit;
        edPassword: TEdit;
        ListBox1:   TListBox;
        edUser:     TEdit;
        edHost:     TEdit;
        procedure Button1Click(Sender: TObject);
        procedure Button_connectClick(Sender: TObject);
        function VerifyHostKeyCallback(const edHost: pansichar; const edPort: integer; const fingerprint: pansichar; const verificationstatus: integer; var storehostkey: boolean): boolean;
        function Listingdir(const names: Pfxp_names): boolean;
     
      private
        SFTP: TTGPuttySFTP;
      public
     
      end;
     
    var
      Form1:  TForm1;
      racine: string;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    function TForm1.Listingdir(const names: Pfxp_names): boolean;
    var
      i: integer;
    begin
      for i := 0 to names.nnames - 1 do
      begin
        if (Utf8ToString(names.names[i].filename) = '.') or (Utf8ToString(names.names[i].filename) = '..') then continue;
        if names.names[i].attrs.permissions and $F000 = $4000 then
        begin
           Listbox1.Items.insert(0, Utf8ToString(names.names[i].filename));
            racine :=Utf8ToString(names.names[i].filename);
           try
          sftp.ListDir(racine);
          except
            continue
           end;
          end;
        end;
     end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      listbox1.Clear;
      button1.Enabled := False;
      try
       // racine := sftp.HomeDir;
        racine:='/';
      sftp.changeDir(racine);
      Listbox1.Items.insert(0, sftp.WorkDir);
      sftp.ListDir(sftp.WorkDir);
      finally
       button1.Enabled := True;
      end;
    end;
     
    function TForm1.VerifyHostKeyCallback(const edHost: pansichar; const edPort: integer; const fingerprint: pansichar; const verificationstatus: integer; var storehostkey: boolean): boolean;
    begin
      if verificationstatus = 0 then
      begin
        Result := True;
        Exit;
      end;
      if MessageDlg('SSH', 'Please confirm the SSH host key fingerprint for ' + ansistring(edHost) + ', port ' + IntToStr(edPort) + ':' + sLineBreak + ansistring(fingerprint), mtConfirmation, [mbYes, mbNo], 0) = mrYes then
        Result     := True;
      storehostkey := Result;
    end;
     
    procedure TForm1.Button_connectClick(Sender: TObject);
    begin
      SFTP := TTGPuttySFTP.Create(True);
      with SFTP do
      begin
        OnListing := Listingdir;
        // OnMessage := MessageCallback;
        // OnProgress := ProgressCallback;
        //OnGetInput := GetInputCallback;
        OnVerifyHostKey := VerifyHostKeyCallback;
        HostName  := edHost.Text;
        UserName  := edUser.Text;
        Password  := edPassword.Text;
        Port      := StrToInt(edPort.Text);
        try
          begin
            Connect;
            form1.Caption := 'connecté...';
          end;
        except
          ShowMessage('erreur connection...');
        end;
      end;
    end;
     
     
    end.

  7. #7
    Membre chevronné

    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 181
    Par défaut
    Bonjoutr,

    Citation Envoyé par sematimo Voir le message
    j'ai déjà essayé avec ce que tu dit, çà fonctionne en parti, j'affiche racine avec un showmessage, le chemin a l'air correct mais pourtant ça coince avec maintenant un message "No such file or directory".
    Je vois dans le code que racine est le résultat d'une conversion UTF8ToString. Il faut utiliser le nom du fichier/répertoire dans son format d'origine (ou dans celui attendu par la bibliothèque) pour pouvoir accéder au système de fichiers distant.

    bb84000

Discussions similaires

  1. interface git pour un dossier distant ssh
    Par vaneck dans le forum Visual Studio
    Réponses: 0
    Dernier message: 31/08/2022, 23h54
  2. [FTP] Tester et créer des dossier distant
    Par clemsouz dans le forum Langage
    Réponses: 7
    Dernier message: 26/09/2006, 16h08
  3. Lire un fichier distant avec SSH
    Par Fritzoune dans le forum Langage
    Réponses: 3
    Dernier message: 06/09/2006, 11h24
  4. Parcourir un dossier distant et lister ses fichiers
    Par Maximus32 dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 22/02/2006, 14h06
  5. afficher le contenu d'un dossier distant
    Par roots_man dans le forum ASP
    Réponses: 3
    Dernier message: 04/02/2005, 17h23

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