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

GTK+ avec C & C++ Discussion :

Liste d'un dossier


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37

    Informations forums :
    Inscription : Juin 2010
    Messages : 241
    Par défaut Liste d'un dossier
    Bonjour,
    je souhaite récupérer la liste des éléments d'un certain type (png par exemple) d'un dossier en utilisant un gtk_list_store par exemple mais je ne sais pas où rentrer le dossier en question.
    Un peu d'aide sur cette fonction sera la bienvenu ( j'essaie de comprendre la doc, mais je trouve pas ce que je veux faire).
    merci.

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Les GtkListStore te permettent d'afficher une liste de noms par exemple. Ils ne servent pas à afficher le contenu d'un dossier, du moins pas directement.

    Pour lire un dossier tu as la structure GDir et ses fonctions affiliées dont g_dir_read_name();.

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37

    Informations forums :
    Inscription : Juin 2010
    Messages : 241
    Par défaut
    Ok, cela fonctionne !
    Je liste les éléments avec le gdir_open et j'enregistre le tout après dans un gtk_list_store.Je liste des images que je stock dans des pixbufs.
    Par contre, je suis surpris que lorsque je liste plus d'une trentaine d'éléments, j'ai une erreur :
    stack smashing detected

    On peut y remédier ?

  4. #4
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Citation Envoyé par le_sayan Voir le message
    j'ai une erreur :
    stack smashing detected

    On peut y remédier ?
    Sans doute, mais en nous montrant du code ce serait plus facile de t'aider !

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37

    Informations forums :
    Inscription : Juin 2010
    Messages : 241
    Par défaut
    Voici mon bout de code :

    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
     
     
    Main.c 
     
    #include <stdlib.h>
    #include <glib/gstdio.h>
    #include <glib.h>
    #include <gtk/gtk.h>
    #include "fonction.h"
     
     
    int main (int argc, char *argv[])
    {
    /// Initialisation de GTK+ */
    gtk_init (&argc, &argv);
      GtkWidget *p_window =  gtk_window_new (GTK_WINDOW_TOPLEVEL);
        GtkWidget *scrolled_window=gtk_scrolled_window_new (NULL, NULL);
     
    GtkWidget *icon_view=gtk_icon_view_new_with_model (afficher_contenu_dosssier ("./Bibliotheque/image"));
      gtk_icon_view_set_text_column (GTK_ICON_VIEW (icon_view), COL_DISPLAY_NAME);
      gtk_icon_view_set_pixbuf_column (GTK_ICON_VIEW (icon_view), COL_PIXBUF);
      gtk_icon_view_set_selection_mode (GTK_ICON_VIEW (icon_view), GTK_SELECTION_MULTIPLE);
      gtk_icon_view_set_item_width (GTK_ICON_VIEW(icon_view),100);
     
        gtk_container_add (GTK_CONTAINER (scrolled_window), icon_view);
        gtk_container_add (GTK_CONTAINER (p_window), scrolled_window);
        /// Affichage de la fenetre principale
    gtk_widget_show_all (p_window);
     
    /// Lancement de la boucle principale
    gtk_main ();
     
      return 0;
    }
     
    Fonction.c
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <gtk/gtkbbox.h>
    #include <string.h>
    #include <glib/gprintf.h>
    #include "fonction.h"
     
     
     
     
    /// Afficher le contenu d'un dossier
    GtkTreeModel* afficher_contenu_dosssier(char* chemin){
        GtkListStore *list_store;list_store = gtk_list_store_new (NUM_COLS, G_TYPE_STRING, GDK_TYPE_PIXBUF);
      GdkPixbuf *pix ;
      GtkTreeIter iter;
    GDir* monDossier=g_dir_open(chemin, 0, NULL);
    G_CONST_RETURN gchar* file= g_dir_read_name(monDossier);
    gchar extension[6];gint i=0;
    gchar nom_de_extension[]=".tiff";
    gchar chemin_pix[40];
     
     
    // Affiche tous les fichiers et dossiers contenus dans monDossier sur la sortie standard
    while(file != NULL)
    {
                // recopie l'extention ( 5 derniers caractères) de file dans extention
                for (i=0;i<6;i++){
                    extension[5-i]=file[strlen(file)-i];
                }
                if (strcmp(extension,nom_de_extension)==0){
                    sprintf(chemin_pix,"%s/%s",chemin,file);
                    printf("%s\n",file);
                    pix = gdk_pixbuf_new_from_file_at_size (chemin_pix,70,70, NULL);
     
                    gtk_list_store_append (list_store, &iter);
                    gtk_list_store_set (list_store, &iter, COL_DISPLAY_NAME, file, COL_PIXBUF, pix , -1);
                                            }
    		file = g_dir_read_name(monDossier);
     
    }
     return GTK_TREE_MODEL (list_store);
    }
     
     
    fonction.h
     
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <gtk/gtkbbox.h>
    #include <string.h>
    #include <glib/gprintf.h>
     
     
    enum
    {
      COL_DISPLAY_NAME,
      COL_PIXBUF,
      NUM_COLS
    };
     
     
     
    GtkTreeModel* afficher_contenu_dosssier(char* chemin);

  6. #6
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    A première vue je cherchais un débordement de pile, mais là je me dis que c'est peut être tu alloues trop de données dans le tas... Tes fichiers .tiff, ils pèsent combien ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37

    Informations forums :
    Inscription : Juin 2010
    Messages : 241
    Par défaut
    Certains pèsent 256 ko mais d'autres pèsent 1Mo. Ca vient certainement de là.
    Sinon, peut-etre qu'en redimensionnant les images avant de les mettre dans le tree_icon_view, ca soulagerait la mémoire.

  8. #8
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Non, cela ne vient pas de là alors... Certains fichiers tiff peuvent être très lourds, c'est pour cela que je voulais vérifier, mais là cela n'a rien d'anormal... Si le poids total avait été de l'ordre de 2Go ç'aurait pu être un problème en 32 bits... Mais en plus tu les redimensionnes en 70x70, donc ils sont vraiment petits... Il faut chercher ailleurs.

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Toute la partie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      // recopie l'extention ( 5 derniers caractères) de file dans extention
                for (i=0;i<6;i++){
                    extension[5-i]=file[strlen(file)-i];
                }
                if (strcmp(extension,nom_de_extension)==0){
                    sprintf(chemin_pix,"%s/%s",chemin,file);
    est un peu inquiétante. Ca ne va pas marcher si tu recontres un fichier de moins de 5 caractères, ça ne va pas marcher non plus sur un chemin/fichier trop long. Par "pas marcher", je veux dire que ça va corrompre silencieusment la pile.
    Je ferais un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (g_str_has_suffix(file, nom_de_extension)) {
       chemin_pix = g_build_filename(chemin, file, NULL);
      .....
       g_free(chemin_pix);
    }

Discussions similaires

  1. récupérer la liste des sous dossiers
    Par Oh!Tofocus dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/09/2009, 23h38
  2. [Batch] Créer liste de fichiers-dossiers modifés depuis ..
    Par sechanbask dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 17/05/2009, 14h05
  3. Réponses: 18
    Dernier message: 03/07/2007, 11h30
  4. Réponses: 1
    Dernier message: 16/02/2007, 12h18
  5. Listing d'un dossier
    Par Niktou dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 21/06/2006, 17h08

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