Listeur de fichiers/dossiers

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 578 fois - Téléchargée 121 fois

Contenu du snippet

Ce petit programme écrit en C liste les fichiers/dossiers d'un repertoire. Il se démarque des autres sources de ce genre par sa stablilité (c.f le code).
Je ne sais pas si il roule sous linux car je l'ai programmé sous windows (et je viens de le ressortir tout poussiereux (lol) ) et j'ai pas le temps de rebooter sous linux pour le compiler (Je dois aller au lycée :) )

Source / Exemple :


#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stddef.h>

int list (char const *directory);
void fclean(char *s_buffer, FILE *stream);

int main (void)
{
   char directory[256] = "";
   do
   {
      printf ("Path or <q> for exit: ");
      fgets(directory, sizeof directory, stdin);
      fclean(directory, stdin);

      if (directory[0] != 'q')
      {
         switch (list (directory))
         {
         case 1:
            printf ("\n%s is unknown\n\n", directory);
            break;
         case 2:               /*fallthrough */
         case 3:
            puts ("\nInternal error\n");
            break;
         case 4:
            printf ("\nError when reading %s\n\n", directory);
            break;
         }
      }
   }
   while (directory[0] != 'q');
   return 0;
}

int list (char const *directory)
{
   DIR *dir = NULL;
   int err = 0;

   if ((dir = opendir (directory)) == NULL)
   {
      err = 4;
   }
   else
   {
      char cwd[256] = "";
      printf ("FOLDER %s:\n", directory);

      /* -tc- we memorise the current working directory */
      if (getcwd (cwd, sizeof cwd) == NULL)
      {
         err = 3;
      }
      else if (chdir (directory) != 0)
      {
         err = 2;
      }
      else
      {
         struct dirent *file;
         while ((file = readdir (dir)) != NULL)
         {
            struct stat infos;
            err = stat (file->d_name, &infos);
            if ((strcmp (file->d_name, ".") != 0) && (strcmp (file->d_name, "..") != 0))
            {
               if (err == 0)
               {
                  printf ("\n%-11s%s\n", S_ISDIR (infos.st_mode) ? "[Folder]" : "[File]", file->d_name);
               }
               else
               {
                  break;
               }
            }
         }
         chdir (cwd);
         printf ("\nEND OF THE FOLDER: %s\n", directory);
      }

      closedir (dir);
      dir = NULL;
   }
   return err;
}

void fclean(char *s_buffer, FILE *stream)
{
    if (s_buffer != NULL && stream != NULL)
    {
        char *pc = strchr(s_buffer, '\n');

        if (pc != NULL) /* La saisie n'a pas ete tronquee */
        {
             /* On remplace '\n' par le caractere nul '\0' */

  • pc = 0;
} else { /* La saisie a e'te' tronquee, on purge le flux d'entree */ int c; while ((c = fgetc(stream)) != '\n' && c != EOF) { //Rien } } } }

A voir également

Ajouter un commentaire Commentaires
Messages postés
102
Date d'inscription
vendredi 21 avril 2006
Statut
Membre
Dernière intervention
10 février 2008

Ah ok mais je pense que cette macro ne concerne que les dll et comme sous linux c'est so c'est sûrement autre chose :)
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
D'après ce qu'ils disent, gcc sous Windows le supporte mais pas un non-Windows.
Messages postés
102
Date d'inscription
vendredi 21 avril 2006
Statut
Membre
Dernière intervention
10 février 2008

Je commence à comprendre :) Uni... suivra les "recommandations" de gcc et l'équivalent sous VC++ fera de même pour son compilateur :)

Ca se tient mais on peut toujours essayer si ca marche avant de dire qu'il y aura des incompatiblités :)
__declspec (existe sous gcc) !

Bonne journée :)
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Le compilo respecte (plus ou moins) les standards mais, une fois les standards respecté, il peut très bien faire ce qui lui chante (comme ajouter des mots clés).
Les headers peuvent différer d'un compilo à l'autre car, ils suivront les spécifications du compilo pour lequel il a été créé.
Messages postés
102
Date d'inscription
vendredi 21 avril 2006
Statut
Membre
Dernière intervention
10 février 2008

Je me suis peut être emporté (trop de devoirs :( ) mais ce que je veux dire c'est que ca devrait fonctionner partout, c'est du C standard (du moins les headers de gcc, mingw, cygwin et d'autres) sont standards. VC++ c'est gcc à la sauce microsoft alors c'est sûr on ne sait jamais :)
Afficher les 18 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.