2010-11-17 7 views
66

J'essaye d'écrire un serveur FTP sur Linux. Dans ce cas, comment puis-je lister les fichiers dans le répertoire sur le terminal par un programme C? Peut-être que je peux utiliser la fonction exec pour exécuter 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?Comment lister des fichiers dans un répertoire d'un programme C?

Merci pour les réponses.

Répondre

128

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 qu'une telle opération est dépendant de la plateforme en C.

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

+0

il est ok maintenant et si facile. Merci pour la réponse à nouveau. – cemal

+8

s'il vous plaît valider si vous l'avez aimé;) –

+0

Fonctionne comme le charme! – asprin

27

Un plus petit à JB Jansen's answer - dans le principal readdir() boucle Je voudrais ajouter ceci:

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

Juste en vérifiant s'il s'agit vraiment d'un fichier, d'un lien (sym), d'un répertoire, etc. REMARQUE: plus sur struct dirent dans libc documentation.

+3

Juste un aparté: Toutes les plateformes ne rempliront pas 'd_type', mais Linux et BSD le feront (je sais que la question est étiquetée Linux, en étendant un peu la réponse); Même dans ce cas, tous les systèmes de fichiers * * ne sont pas pris en charge * uniformément *, mais ils devraient fonctionner avec la plupart des FS. – omninonsense

3

Voici un programme complet comment la liste récursive 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); 
} 
Questions connexes