web-dev-qa-db-fra.com

Comment lister des fichiers dans un répertoire dans un programme C?

J'essaie d'écrire un serveur FTP sur Linux. Dans cette affaire, comment puis-je lister les fichiers du répertoire sur le terminal à l'aide d'un programme C? Peut-être que je peux utiliser la fonction exec pour lancer la commande find mais je veux que le nom du fichier soit une chaîne pour envoyer le programme client. Comment puis-je faire ceci?

Merci pour les réponses.

78
cemal

Un exemple, disponible pour les systèmes compatibles POSIX:

/*
 * This program displays the names of all files in the current directory.
 */

#include <dirent.h> 
#include <stdio.h> 

int main(void) {
  DIR *d;
  struct dirent *dir;
  d = opendir(".");
  if (d) {
    while ((dir = readdir(d)) != NULL) {
      printf("%s\n", dir->d_name);
    }
    closedir(d);
  }
  return(0);
}

Attention, une telle opération dépend de la plateforme en C.

Source: http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1046380353&id=1044780608

154

Un petit ajout à réponse de JB Jansen - dans la boucle principale readdir(), je voudrais ajouter ceci:

  if (dir->d_type == DT_REG)
  {
     printf("%s\n", dir->d_name);
  }

Je vérifie juste si c'est vraiment un fichier, pas un lien (sym), un répertoire ou quoi que ce soit.

NOTE: plus sur struct dirent in libc documentation .

31
Kamiccolo

Voici un programme complet pour lister récursivement le contenu du dossier:

#include <dirent.h> 
#include <stdio.h> 
#include <string.h>

#define NORMAL_COLOR  "\x1B[0m"
#define GREEN  "\x1B[32m"
#define BLUE  "\x1B[34m"



/* let us make a recursive function to print the content of a given folder */

void show_dir_content(char * path)
{
  DIR * d = opendir(path); // open the path
  if(d==NULL) return; // if was not able return
  struct dirent * dir; // for the directory entries
  while ((dir = readdir(d)) != NULL) // if we were able to read somehting from the directory
    {
      if(dir-> d_type != DT_DIR) // if the type is not directory just print it with blue
        printf("%s%s\n",BLUE, dir->d_name);
      else
      if(dir -> d_type == DT_DIR && strcmp(dir->d_name,".")!=0 && strcmp(dir->d_name,"..")!=0 ) // if it is a directory
      {
        printf("%s%s\n",GREEN, dir->d_name); // print its name in green
        char d_path[255]; // here I am using sprintf which is safer than strcat
        sprintf(d_path, "%s/%s", path, dir->d_name);
        show_dir_content(d_path); // recall with the new path
      }
    }
    closedir(d); // finally close the directory
}

int main(int argc, char **argv)
{

  printf("%s\n", NORMAL_COLOR);

    show_dir_content(argv[1]);

  printf("%s\n", NORMAL_COLOR);
  return(0);
}
8
Faroq AL-Tam

Le code ci-dessous n’imprimera que les fichiers d’un répertoire et exclura les répertoires d’un répertoire donné lors du parcours.

#include <dirent.h>
#include <stdio.h>
#include <errno.h>
#include <sys/stat.h>
#include<string.h>
int main(void)
{
    DIR *d;
    struct dirent *dir;
    char path[1000]="/home/joy/Downloads";
    d = opendir(path);
    char full_path[1000];
    if (d)
    {
        while ((dir = readdir(d)) != NULL)
        {
            //Condition to check regular file.
            if(dir->d_type==DT_REG){
                full_path[0]='\0';
                strcat(full_path,path);
                strcat(full_path,"/");
                strcat(full_path,dir->d_name);
                printf("%s\n",full_path);
            }
        }
        closedir(d);
    }
    return(0);     
}
1
Joy