2010-11-17 16 views
66

Sto provando a scrivere un server ftp su Linux. In questo caso, come posso elencare i file nella directory sul terminale con un programma C? Forse posso usare la funzione exec per eseguire il comando find ma voglio il nome del file come stringa per inviare il programma client. Come posso fare questo?Come elencare i file in una directory in un programma C?

Grazie per le risposte.

risposta

128

Un esempio, disponibile per i sistemi compatibili 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); 
} 

Attenzione che una tale operazione dipende dalla piattaforma in C.

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

+0

è ok ora e così facile. Grazie per la risposta di nuovo. – cemal

+8

per favore confermalo se ti è piaciuto;) –

+0

Funziona come un incantesimo! – asprin

27

Una piccola aggiunta a JB Jansen's answer - nella main readdir() loop Vorrei aggiungere questo:

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

Basta controllare se è veramente un file, non un link (sym), directory o altro.

NOTA: ulteriori informazioni su struct dirent in libc documentation.

+3

Solo a parte: non tutte le piattaforme riempiranno 'd_type', ma Linux e BSD lo faranno (so che la domanda è codificata in Linux, semplicemente estendendo leggermente la risposta); anche allora, non * tutti * i filesystem sono supportati * in modo uniforme *, tuttavia dovrebbe funzionare con la maggior parte delle FS. – omninonsense

3

Qui è un programma completo come elencare ricorsivamente il contenuto della cartella:

#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); 
} 
Problemi correlati