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 :

indy 10 modifier les permissions d'un fichier sur un serveur ftp


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut indy 10 modifier les permissions d'un fichier sur un serveur ftp
    Bonjour,

    J'arrive à me connecter au serveur ftp à l'aide du composant TidFTP

    J'arrive à lister les fichiers du répertoire et à naviguer dans les répertoires.

    Je sais que c'est un serveur unix car la liste des répertoires arrive avec le fameux groupe de 10 caractères en début de ligne (-rwxrwxrwx)

    J'arrive à uploader un fichier

    Mais ce fichier n'est pas visible par défaut par les utilisateurs web si je ne modifie pas ses attributs.
    Lorsque je le charge, il se retrouve en 600 et il faudrait qu'il soit en 644.

    Avec Filezilla, avec les mêmes login et mot de passe que ceux utilisés dans le programme, je peux changer les permissions, donc je suppose que si j'ai les bonnes commandes je dois pouvoir le faire par programme.

    Mais je n'arrive pas à trouver comment faire ni les bonnes commandes avec les composants ftp indy 10 inclus dans delphi 10.4.

    Je souhaiterais également pouvoir supprimer des fichiers sur le ftp (par exemple en fonction de leur date).

    Merci à ceux qui pourraient me mettre sur la voie.

    Bien cordialement.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut
    J'avais pourtant fait moultes recherches sur les faq, mais j'ai continué et j'avais loupé celle là :

    https://delphi.developpez.com/faq/?p...ier-avec-IdFtp

    où c'est très bien décrit pour les changements de permissions.

    Par contre je n'arrive pas à faire fonctionner directorylisting selon l'exemple décrit https://delphi.developpez.com/faq/?p...P-sans-analyse car cela me provoque une erreur "Aucun analyseur de liste FTP n'a été enregistré" alors que j'ai bien fait le list juste avant

    Je suppose que je vais trouver pour ça et pour supprimer aussi .....?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut
    Bon pour supprimer c'est tout simple il y a une méthode delete dans le composant tidftp.

    Par contre je n'ai toujours pas trouver comment faire fonctionner DirectoryListing.
    J'ai vu dans le source qu'un list libère la collection FdirectoryListing, mais je n'ai pas compris comment cette collection est recréée.

    Faut-il faire un appel d'une façon particulière ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    400
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 400
    Par défaut
    Alors, j'ai trouvé qu'il fallait rajouter IdAllFTPListParsers à la clause uses ... ou le listparsers souhaité uniquement.
    En ajoutant IdAllFTPListParsers, on couvre tous les besoins apparemment ..

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 093
    Par défaut
    Citation Envoyé par navyg Voir le message
    Je sais que c'est un serveur unix car la liste des répertoires arrive avec le fameux groupe de 10 caractères en début de ligne (-rwxrwxrwx)
    Pas forcément, quand j'ai implémenté un TIdFTPServer sur Windows, j'ai émulé cela et quelqu'un de plus concerné par ce genre de chose aurait pu pousser surement plus loin

    A la base, je devais utiliser un FTP de la société existant mais lorsque j'ai annoncé la fréquence d'utilisation, j'ai vite compris que le plus simple serait que mon Server contiennent le serveur FTP en interne.
    J'ai donc juste reproduit les droits comme je les voyais pour ce serveur

    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
    //------------------------------------------------------------------------------
    procedure TxxxSpareFTPServer.ListDirectoryEventHandler(ASender: TIdFTPServerContext; const APath: TIdFTPFileName; ADirectoryListing: TIdFTPListOutput; const ACmd, ASwitches: string);
     
      procedure AddItemToListOutput(const AItemName: TFileName; AItemType: TIdDirItemType; AItemSize: Int64; AItemDate: TDateTime);
      begin
        with ADirectoryListing.Add() do
        begin
          ItemType := AItemType;
          FileName := AItemName;
          Size := AItemSize;
          ModifiedDate := AItemDate;
          // Simule les même droits que sur "ftp.xxxxxxxxxxx.com" pour l'utilisateur "xxx" !
          OwnerName := ASender.Username;
          GroupName := 'all';
          if ItemType = ditDirectory then
          begin
            UnixOwnerPermissions := 'rwx';
            UnixGroupPermissions := 'r-x';
            UnixOtherPermissions := 'r-x';
          end
          else
          begin
            UnixOwnerPermissions := 'rw-';
            UnixGroupPermissions := 'r--';
            UnixOtherPermissions := 'r--';
          end;
        end;
      end;
     
      procedure EnumFiles(const ALocalDir: TFileName; const AFilter: TFileName);
      var
        sr: TSearchRec;
      begin
        if System.SysUtils.FindFirst(IncludeTrailingPathDelimiter(ALocalDir) + AFilter, faNormal, sr) = 0 then
        begin
          try
            repeat
              AddItemToListOutput(sr.Name, ditFile, sr.Size, sr.TimeStamp);
            until FindNext(sr) <> 0;
          finally
            System.SysUtils.FindClose(sr);
          end;
        end;
      end;
     
      procedure EnumDirectories(const ALocalDir: TFileName);
      var
        Filter: string;
        sr: TSearchRec;
      begin
        Filter := IncludeTrailingPathDelimiter(ALocalDir) + '*';
        if System.SysUtils.FindFirst(Filter, faDirectory, sr) = 0 then
        begin
          try
            repeat
              if ((sr.Attr and faDirectory) = faDirectory) and (sr.Name <> '.') and (sr.Name <> '..') then
              begin
                AddItemToListOutput(sr.Name, ditDirectory, sr.Size, sr.TimeStamp);
              end;
     
            until System.SysUtils.FindNext(sr) <> 0;
          finally
            System.SysUtils.FindClose(sr);
          end;
        end;
      end;
     
    var
      WinCurrentDir, WinNewDir, WinNewCompleteDir: TFileName;
      ld: Integer;
      Filter: TFileName;
    begin
      try
        WinCurrentDir := ChangeToWindowsPathDelimiter(ASender.CurrentDir);
        if ContainsStr(APath, '*') then
        begin
          if APath[Length(APath)] = PATH_DELIMITER_FTP then
            WinNewDir := Copy(APath, 1, Length(APath) - 1)
          else
            WinNewDir := APath;
     
          ld := LastDelimiter(PATH_DELIMITER_FTP, WinNewDir);
          Filter := Copy(WinNewDir, ld + 1, MaxInt);
          WinNewDir := ChangeToWindowsPathDelimiter(Copy(WinNewDir, 1, ld));
        end
        else
          WinNewDir := ChangeToWindowsPathDelimiter(APath);
     
        WinNewCompleteDir := ExpandWindowsPath(FLocalRootDirectory, WinCurrentDir, WinNewDir);
        if DirectoryExists(WinNewCompleteDir) then
        begin
          if Filter = '' then
          begin
            // Les Fichiers !
            // Toutes les extensions pour les voir via FileZilla même ce n'est ni des .dat et ni des .tmp
            EnumFiles(WinNewCompleteDir, '*.*');
            // Les Dossiers !
            EnumDirectories(WinNewCompleteDir);
          end
          else
            EnumFiles(WinNewCompleteDir, Filter);
        end
        else
          raise ExxxSpareFTPServerException.CreateFmt('%s: Failed to retrieve the contents of the folder', [APath]);
      except
        on E: Exception do
        begin
          DoError(APath, E.Message);
          raise;
        end;
      end;
    end;
    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

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 093
    Par défaut
    Et pour le List(), je n'ai jamais eu besoin de Parser

    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
    //------------------------------------------------------------------------------
    function TSLTFTP.InitializeFiles(): Boolean;
    var
      TmpList: TStrings;
    begin
      Result := False;
      if FConnection.Connected then
      begin
        if not Assigned(FFiles) then
        begin
          TmpList := TStringList.Create();
          try
            try
              FConnection.List(TmpList, FFileFilter, False);
              if TmpList.Count > 0 then
              begin
                FFiles := TmpList;
                Exit(True);
              end;
            except
              on E: Exception do
              begin
                {$IFDEF DEBUG_SLT_FTP}OutputDebugFTP('InitializeFiles : ' + E.Message);{$ENDIF DEBUG_SLT_FTP}
                Result := False;
              end;
            end;
          finally
            if not Result then
              TmpList.Free();
          end;
        end;
      end;
     
      Result := Assigned(FFiles) and (FFiles.Count > 0);
    end;
    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

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

Discussions similaires

  1. [WD18] Lister les fichiers sur un serveur FTP
    Par beast dans le forum WinDev
    Réponses: 3
    Dernier message: 23/05/2016, 20h47
  2. Envoyer un fichier sur un serveur FTP par proxy
    Par Tierisa dans le forum Access
    Réponses: 4
    Dernier message: 13/12/2005, 16h39
  3. Envoi de fichier sur un serveur FTP
    Par pepe2006 dans le forum Access
    Réponses: 6
    Dernier message: 02/12/2005, 10h19
  4. Réponses: 4
    Dernier message: 15/09/2005, 13h27
  5. [FTP] Test de l'existence d'un fichier sur un serveur ftp
    Par lapartdombre dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 01/08/2005, 14h13

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