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

Ada Discussion :

Spécification d'un file manager et utilisation de GNAT.Directory_Operations.Iteration


Sujet :

Ada

  1. #1
    Invité
    Invité(e)
    Par défaut Spécification d'un file manager et utilisation de GNAT.Directory_Operations.Iteration
    Bonjour,

    Dans le cadre du développement d'un petit programme en mode console, je doit charger des fichiers sélectionnés par l'utilisateur au cours de l'exécution. Pour faciliter la tache de l'utilisateur, je souhaite lui présenter la liste des fichiers et répertoires présents dans le répertoire spécifié par l'utilisateur puis récupérer le fichier sélectionné afin de le charger. J'ai donc besoin d'écrire une petite bibliothèque pour assurer le service.

    Selon vous à quoi peut ressembler la spécification d'une telle bibliothèque ?

    Je n'ai aucune restriction particulière à formuler pour le moment si ce n'est que J'écris pour Gnu/Linux sur Gnu/LInux avec Gnat 4.1

    Si la description ci-dessus vous semblait insuffisante, n'hésitez pas à poster ici.

    Merci pour votre contribution.

    Ou si il existe déjà un bibliothèque qui rend ce service, je suis preneur.
    Dernière modification par Invité ; 04/04/2008 à 19h40. Motif: Extension à l'utilisation de GNAT.Directory_Operations.Iteration

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    Essaie GNAT.Directory_Operations. En fait, on gère un directory comme un fichier dans lequel les items sont les noms des fichiers du directory .

  3. #3
    Invité
    Invité(e)
    Par défaut
    C'est pas pour dire ... enfin si

    j'ai fait ça :

    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
     
    with Ada.Text_Io, Gnat.Directory_Operations;
     use Ada.Text_Io, Gnat.Directory_Operations;
    procedure Main is
     
       Current_Dir_Type : Dir_Type;
       Readed_Dir : String(1..4096) := (others => Character'Val(32));
       Last : Natural := 0;
     
    begin
     
       Open(Current_Dir_Type, Get_Current_Dir);
       Read(Dir   => Current_Dir_Type,
            Str   => Readed_Dir,
            Last  => Last);
       Put_Line(Readed_Dir(1..Last));
       Close(Current_Dir_Type);
    end Main;

    C'est puissant .... ça me retourne '.' , point, c'est bleuffant quand même

    Je poursuis ...

  4. #4
    Invité
    Invité(e)
    Par défaut
    A ben non, y a plus rien ...

    C'est quoi l'astuce là ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    A y est, j'ai compris .. enfin, j'avais zappé la spec de read entre temps ...


    Read est itératif entre un open et un close si je comprend bien .....


    Donc, oui, c'est pas la bonne abstarction ...

    Il faut que je face une biblio ....

    Donc .. d'après vous ... la spec .. à quoi elle ressemble ?

    Je vais bien y arriver ... mais j'aurais aimé des avis extérieur

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    Et si tu essaie ça :
    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
    with Ada.Text_Io, Gnat.Directory_Operations;
     use Ada.Text_Io, Gnat.Directory_Operations;
    procedure Main is
    
       Current_Dir_Type : Dir_Type;
       Readed_Dir : String(1..4096) := (others => Character'Val(32));
       Last : Natural := 0;
    
    begin
    
       Open(Current_Dir_Type, Get_Current_Dir);
    
     loop
       Read(Dir   => Current_Dir_Type,
            Str   => Readed_Dir,
            Last  => Last);
    exit when Last = 0;
       Put_Line(Readed_Dir(1..Last));
    end loop;
    
       Close(Current_Dir_Type);
    end Main;
    Dans la spécification, il est dit qu'il y a toujours dans le répertoire "." (le répertoire courant) et ".." (le répertoire parent).

  7. #7
    Invité
    Invité(e)
    Par défaut
    Yep !

    Ca y est j'ai pigé. Merci Lowelace.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Voici ma spécification.

    Une procédure qui retourne toutes les occurrences match dans une pile.

    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
    with Pg_Pile;
    with Ada.Strings.Unbounded;
    with Gnat.Os_Lib;
    package Files_Managment is
    
       function Is_Regular_File(Filename : in String) return boolean;
    
       Package String_Access_Stack is
          new Pg_Pile(Ada.Strings.Unbounded.String_Access, 1024);
       use String_Access_Stack;
    
       procedure Free(Stack : in out T_Pile);
    
       procedure Completed_Content(Pattern : in String;
                                   Content : out T_Pile);
    
    
    private
    
       function Is_Regular_File(Filename : in String) return Boolean renames Gnat.Os_Lib.Is_Regular_File;
    
    end Files_Managment;
    Dernière modification par Invité ; 04/04/2008 à 10h54. Motif: echange de file_exists contre is_regular_file

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    je ne comprend rien au commentaire de GNAT.Directory_Operations.Iteration et j'en aurais besoin ... j'aurais besoin d'un coup de main pour l'instanciation et l'utilisation de Find

    Un petit exemple serait le bien venu.

    Merci.

    Bonsoir.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    Que veux-tu faire exactement ? Comment veux-tu utiliser le Find ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Lowelace Voir le message
    Que veux-tu faire exactement ? Comment veux-tu utiliser le Find ?
    Bonsoir Lowelace

    Pardon,

    Je souhaite sortir la listes des fichiers commencent par le chemin spécifié.

  12. #12
    Invité
    Invité(e)
    Par défaut
    C'est à dire,

    Si je rentre "/home/fichier", je souhaiterais retourner la liste des fichiers commencent par "fichier"

    fichier_1
    fichier_2

    etc

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    Et le bout de programme précédent ne te suffit pas ? Pourquoi t'embêter avec Find ?

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Lowelace Voir le message
    Et le bout de programme précédent ne te suffit pas ? Pourquoi t'embêter avec Find ?
    Pour faire de la complétion ..

    Présenter uniquement la liste des fichiers correspondant au pattern saisi.

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 114
    Points : 139
    Points
    139
    Par défaut
    Ok, j'ai un début de réponse :
    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
    procedure Affiche_Fichier(Item  :        String;
             Index :        Positive;
             Quit  : in out Boolean) is
    begin
        put_Line(String);
    end;
    
    procedure Ls is new Find(Action => Affiche_Fichier);
    
    -- variante avec Wildcard_Iterator, peut-être plus naturel
    procedure Ls_Bis is new Wildcard_Iterator(Action => Affiche_Fichier);
    
    procedure Main is
     My_Dir : constant String := "/home";
    My_File_Root : Constant String := "fichier";
    begin
         Ls(My_Dir, My_File_Root); -- équivalent Unix : ls /home/fichier*.
    
         Ls_Bis(My_Dir & "/" & My_File_Root & "*");
    end;

  16. #16
    Invité
    Invité(e)
    Par défaut
    Merci Lowelace,

    je vais plancher là dessus,

    Si je comprends, ça m'aide pas vraiment pour compléter la ligne de saisi du nom de fichier.

  17. #17
    Invité
    Invité(e)
    Par défaut Mon implémentation de File_Managment
    Mon implémentation de File_Managment, à l'heure qu'il est
    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
     
    with Gnat.Directory_Operations;
     use Gnat.Directory_Operations;
    with Ada.Strings.Unbounded;
     use Ada.Strings.Unbounded;
     
    with Compare_Strings_access;
    use Compare_Strings_access;
    with Ada.Containers.Generic_Array_Sort;
    package body Files_Managment is
     
       type T_Content_Tab is array (Integer range <>) of
         Ada.Strings.Unbounded.String_Access;
     
       procedure Dir_Sort is new Ada.Containers.Generic_Array_Sort
         (Integer, Ada.Strings.Unbounded.String_Access, T_Content_Tab, Compare_Strings_Access."<");
     
       function Expand_Path(Path_Name : in String) return String is
       begin
          return Gnat.Directory_Operations.Expand_Path(Path_Name);
       end Expand_Path;
     
     
       procedure Completed_Content(Pattern : in String;
                                   Content : out T_Pile) is
          Directory_Type : Dir_Type;
          Readed_Filename : String(1..1024) :=
            (others => Character'Val(32));
          Last_Readed_Filename : Natural := 0;
          Ptr_Readed_Filename : Ada.Strings.Unbounded.String_Access;
          Developped_Pattern : String(1..1030);
     
       begin
          if Pattern(1) = '~' then
             Developped_Pattern(1..Pattern'Length+4) := "$HOME" & Pattern(2..Pattern'Length);
          else
             Developped_Pattern(1..Pattern'Length) := Pattern;
          end if;
          --if Base_Name(Expanded_Path(Pattern)) / "" then
          -- find;
          if Is_Directory(Dir_Name
             (Gnat.Directory_Operations.Expand_Path(Developped_Pattern))) then
             Open
               (Directory_Type,Dir_Name
                  (Gnat.Directory_Operations.Expand_Path(Developped_Pattern)));
             Read(Directory_Type, Readed_Filename, Last_Readed_Filename);
             Read(Directory_Type, Readed_Filename, Last_Readed_Filename);
             loop
                Read(Directory_Type, Readed_Filename, Last_Readed_Filename);
                exit when Last_Readed_Filename = 0;
                Ptr_Readed_Filename := new String ' (Readed_Filename(1..Last_Readed_Filename));
                Empiler(Ptr_Readed_Filename, content);
             end loop;
             if Haut_De_Pile(Content) > 1 then
                declare
                   Content_Tab : T_Content_Tab(1..Haut_De_Pile(Content));
                begin
                   for I in 1..Haut_De_Pile(Content) loop
                      Depiler(Content_Tab(I), Content);
                   end loop;
                   Dir_Sort(Content_Tab);
                   for I in 1..Content_Tab'Length loop
                      empiler(Content_Tab(I), Content);
                   end loop;
                end;
             end if;
          end if;
       end Completed_Content;
     
     
       procedure Free(Stack : in out T_Pile) is
          Temp : Ada.Strings.Unbounded.String_Access;
       begin
          while Haut_De_Pile(Stack) /= 0 loop
             Depiler(Temp, Stack);
             Ada.Strings.Unbounded.Free(Temp);
          end loop;
       end Free;
     
     
    end Files_Managment;
    Dernière modification par Invité ; 04/04/2008 à 22h22. Motif: pas besoin d'Os_Lib

  18. #18
    Invité
    Invité(e)
    Par défaut
    Lowelace !!

    Laissez tombé pour la complétion ... C'est un peu complexe, et je souhaiterais parvenir à l'objet de ce programme le plus rapidement possible.

    Ca attendra.

    (Pardon)

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 11/06/2012, 14h39
  2. [MooTools] Flash player sur Moo Tools File Manager
    Par Foxydev dans le forum Bibliothèques & Frameworks
    Réponses: 0
    Dernier message: 02/11/2009, 17h51
  3. [UFT]File management en ligne de commande
    Par peesse dans le forum Développement
    Réponses: 1
    Dernier message: 30/10/2009, 16h21
  4. [CKEditor] Chemin dans file manager
    Par mic79 dans le forum Bibliothèques & Frameworks
    Réponses: 7
    Dernier message: 24/10/2007, 16h05
  5. A propos des 'File management Functions' de Windows
    Par znaidi dans le forum Windows
    Réponses: 3
    Dernier message: 01/04/2003, 16h01

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