begin process at 2012 02 12 17:27:28
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > LISTEUR DE FICHIERS/DOSSIERS

LISTEUR DE FICHIERS/DOSSIERS


 Information sur la source

Note :
Aucune note
Catégorie :Fichiers / Disque Classé sous :fichiers, listeur, dossier, disque, saylar Niveau :Débutant Date de création :14/11/2007 Date de mise à jour :18/11/2007 16:16:25 Vu :6 710

Auteur : saylar

Ecrire un message privé
Site perso
Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note

 Description

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

  • #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
  • }
  • }
  • }
  • }
#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
            }
        }
    }
}



 Historique

15 novembre 2007 18:52:35 :
Modification simple du code.
18 novembre 2007 15:21:07 :
Le code est maintenant compatible linux et windows (une recompilation suffit :) )
18 novembre 2007 16:16:25 :
Remplacement de scanf par fgets

 Sources du même auteur

Source avec Zip Source avec une capture SIMULATEUR DE VIE (LIFE)
Source avec Zip SAMSOFT DEV
A SUPPRIMER
A SUPPRIMER

 Sources de la même categorie

Source avec Zip Source avec une capture GENERE BMP par lajouad
Source avec Zip Source avec une capture GETIONNAIRE D'UNE BIBLIOTHÉQUE EN C par benzarabel
FONCTION D'ÉDITION DE FICHIER BIT À BIT [C-MULTIPLATEFORME] par lynxtyle
Source avec Zip Source avec une capture UN GESTIONNAIRE DU FICHIER par benzarabel
Source avec Zip COPIE DE FICHIERS PAR RESEAU LOCAL par cczerty

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture CONVHTML : UN UTILITAIRE DE CONVERSION POUR FICHIERS HTML par pgl10
Source avec Zip COPIE DE FICHIERS PAR RESEAU LOCAL par cczerty
Source avec Zip [MYLIB] GESTION DE FICHIERS par Galaad2908
GESTION DE FICHIER ET DOSSIER + AUTRES par shinji63
Source avec Zip TEMPLATES C/C++ POUR VS 2010 par BruNews

Commentaires et avis

Commentaire de SAKingdom le 14/11/2007 15:32:51

Je ne vois pas ce qu'il y a de vraiment différent avec les autres sources du même genre.

De plus, tu invoques la stabilité mais, à plusieurs endroits, dans ton code, tu quitte direct la fonction lors d'erreur sans même fermer le répertoire qui lui est parfaitement ouvert.
Ensuite:
if (strcmp(file->d_name, ".") && strcmp(file->d_name, ".."))

strcmp pour si peux...

Finalement
(void) sizeDir;

Hein ??? C'est quoi ça ?

Commentaire de saylar le 15/11/2007 18:49:43

(void) sizeDir; C'est pour contourner le unused variable sizeDir alors qu'elle est utilisée mais bon, enlevez ce morceau de code si vous le voulez.

Pour le premier truc c'est en fait :

if (strcmp(file->d_name, ".") != 0 && strcmp(file->d_name, "..") != 0)

Je viens de corriger, je vais updater sinon il est stable comparé à d'autres sources. Je n'ai absolument pas dit stable comparé à toutes les sources du même genre !

Merci pour le commentaire :)

Commentaire de SAKingdom le 17/11/2007 22:06:49

Oui, je sais que if(strcmp(...)) équivaut à if(strcmp(...) != 0)
Ce que je voulais dire, c'est que tu peux te passer de cette fonction, surtout pour tester 1 ou 2 caractères.
Ensuite, sizeDir, dans la fonction list, est un de ses paramètres. Si il n'est pas utiliser (car, je ne vois nul part, dans ta fonction list, l'utilisation de sizeDir), pourquoi ne pas le supprimer ?

Finalement, tu n'as toujours pas corrigé le problème de ta fonction qui, en cas d'erreurs, retourne sans fermer le répertoire.

Commentaire de saylar le 18/11/2007 15:20:05

Je viens de lire mes emails et surprise :) Un monsieur du nom de Nicolas Stibon m'a modifié mon code pour qu'il fonctionne sous linux :) Je ne sais pas s'il a modifié autre chose mais j'ai aussi tôt (on écrit comme cela :) ) testé sous Linux et Windows et cela fonctionne :) Je met à jour cela (ca ne tient plus que sur un main).

Sinon il reste un petit truc : c'est surement correct (il a plus d'experiences que moi):

scanf ("%255[^\n]", directory);
scanf ("%*[^\n]"), getchar ();

Moi j'utilise fgets (scanf étant une grosse rose remplie de ronces pour les débutants :) )

Commentaire de SAKingdom le 18/11/2007 15:53:45

Attention, ton code ne compile plus sous windows.
unistd.h et dirent.h n'existent pas.
Sous windows, c'est windows.h qu'il faut inclure (pour unistd.h en tout cas, dirent.h, j'ignore ce que c'est).

Ensuite:
scanf(...) bof bof.
Je te suggère vivement de réutiliser fgets à la place. On aura pas ces stupides regex à formater ce qui prend un temps fou.

Commentaire de saylar le 18/11/2007 15:58:41

Ouai pour le fgets je corrige :) mais les deux headers existent bien sous windows :) je viens de voir :  c:\MinGW\include ils y sont !

Voilà :)

Commentaire de SAKingdom le 18/11/2007 16:02:12

N'existe pas ni sous VC++, ni avec la PSDK.

Commentaire de saylar le 18/11/2007 16:12:58

Je veux pas lancer de débat mais pour faire du C (normalisé :) ) pour windows et linux moi je prend MinGW.
Si je veux faire du C++, je prend MinGW + Qt4 (pas de VC++ :D ) c'est mon choix et il ne changera pas. J'ai que 15 ans et je veux faire des trucs utilisables partout :)
Vous pouvez trouver ces headers partout sur le net (la flemme de mettre sur mon serveur les deux fichiers (lol ))

Commentaire de SAKingdom le 18/11/2007 16:21:57

Bon ben dans ce cas, va falloir préciser que ça ne compilera qu'avec ce compilateur.

Commentaire de saylar le 18/11/2007 18:11:44

Ca compilera avec n'importe quel compilateur C encore faut il ajouter les headers (lol)

Commentaire de SAKingdom le 18/11/2007 18:35:35

À éviter si possible. Il risque d'y avoir des conflits entre les différentes versions et headers. Si seul mingw est capable de le compiler directement alors ne le compile qu'avec mingw.

Commentaire de saylar le 18/11/2007 18:58:02

Dans ce cas si on veut utiliser le header fait par un ami on va se dire non il n'est pas dans mon compilateur, j'y touche pas ! C'est pas de l'esprit communautaire. Pour faire un programme multiplateforme, je doute qu'avec VC++ se soit correct moi j'utilise un compilateur qui conserve les standards et qui n'extrapole pas ! Si vous voulez rester avec vos headers, soit ! Mais ne dites pas qu'il y aura des conflits en utilisant des headers. Si vous avez la dernière version d'un header, vous le gardez sinon mettez le à jour et si vous ne l'avez pas gardez le ca peut toujours servir. Bien entendu que je peux prendre windows.h à la place des autres mais est-ce que ca fonctionnera sur mac et linux ? Est-ce que  le petit jack qui vient d'apprendre le C, qui est sous linux et qui veut tester mon programme avec gcc pourra ? Avec VC++ on lui rira au nez ! Il faut être lucide, soit vous programmez pour vous et dans ce cas on peut se permettre d'utiliser n'importe quoi (tant que ca fonctionne sur sa becanne) soit vous vous mettez au service de la communauté et vous vous en tenez aux standards !

Voilà ce que j'en dis (lol)

PS: Bon ben va bien falloir que je me replonge sur mon dm de maths (quel vie : lycée -> prog -> dodo) !

Bonne soirée :)

Commentaire de SAKingdom le 18/11/2007 19:20:44

Je ne sais pas d'où vient ce discours. Ce que je dis, c'est qu'il vaut mieux éviter de mélanger les headers d'un compilo à l'autre. Rien à voir avec "l'esprit communautaire".
Rien ne te dis que unistd de mingw ne causera pas de conflits avec VC++.
Rien ne te dis que les headers sont structuré semblablement pour tout les compilo.
Il y a un mot clé sous les compilo gcc nommé __attribute__. Ce mot clé n'existe pas sous VC++.
À l'inverse, sous VC++, il existe __declspec, inexistant sous gcc.
Qu'arrivera t-il si tu ajoute un header contenant un de ces mots clés sur un compilo ne le supportant pas ?
Ben voilà, c'est ce que je veux dire par: Il y aura des conflits. Et encore, pas seulement des conflits mais des incompatibilités.

Commentaire de saylar le 18/11/2007 19:29:35

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 :)

Commentaire de SAKingdom le 18/11/2007 19:51:03

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éé.

Commentaire de saylar le 19/11/2007 08:44:52

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 :)

Commentaire de SAKingdom le 19/11/2007 18:11:11

D'après ce qu'ils disent, gcc sous Windows le supporte mais pas un non-Windows.

Commentaire de saylar le 20/11/2007 17:03:27

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 :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

lister les fichiers du disque dur en c et non en c++ [ par sebos2013 ] Quelqu'un pourrait il m'aider.J'essaie de creer un prog en c qui permet de listertout les fichiers du disque dur et de stoquer le nom et le chemin de HELP creation de dossier [ par asnow ] SALUT A TOUS Je voudrais savoir comment ouvrir est integrer des fichiers dans un dossier en C sous dev-C++.Avec cette commande CreateDirectory(nom,NUL MingW32 [ par ac117 ] Salut,Y a t-il un installeur de MingW32 dans la salle ?Parce que à premiere vue, c'est facile. L'exemple "hello world" marche bien, mais dés qu'il s'a detection de fichiers [ par grems ] Salut !j'ai envie de réaliser un ptit bout de prog, mais jsui totalement novice dans ce domaine, et jvoudrai faire une application permettant de détec Client download fichiers par serveur [ par bthivent ] Bonjour ! J'ai créé un système de client/serveur qui marche très bien. Et maintenant j'aimerais que, dès que le client se connecte au serveur, il y ai Ouvrir tous les fichiers d'un dossier 1 par1 [ par Buzu ] Je cherche à développer une fonction qui ouvre tous les fichiers d'un dossier spécifié 1 par 1.Existe-t-il une fonction qui renvoie le nombre de fichi Création et suppression de dossier [ par asmanur ] Bonjour,alors j'ai quelque question à poser sur les fichiers1) Comment crée-t-on un dossier?2)Comment supprime-t-on des fichiers et des dossiers3)Sous lister les fichiers dans un dossier [ par shadow1779 ] voila j'aimerai savoir comment faire pour lister les fichiers present dans un dossier si cela est possible en C. fichiers bloqueée [ par montejc ] Bonjour, <p class="MsoNormal" style="MA Tous les fichiers d'un dossier [ par ndubien ] Bonjour,Je cherche à savoir :comment faire pour connaître le nom de tous les fichiers contenus dans un dossier spécifique?Merci d'av


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,229 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales