How to view files in a directory in program C?

I am trying to write an ftp server on Linux. In this question, how can I list files in a directory on a terminal with C program? Maybe I can use the exec function to run the find command, but I want the file name to be like a string to send the client program. How can i do this?

Thanks for answers.

+62
c linux
Nov 17 '10 at 13:11
source share
3 answers

An example available for POSIX compatible systems:

/* * 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); } 

Beware that such an operation is platform dependent in C.

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

+119
Nov 17 '10 at 13:22
source share

One tiny addition to JB Jansen's answer - in the main readdir() loop, I would add the following:

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

Just check if it is really a file, not a (sym) link, directory, or anything else.

NOTE: more about struct dirent in the libc documentation .

+27
Jul 16 '13 at 17:39
source share

Here is the complete program for recursive folder contents:

 #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); } 
+3
Jan 07 '17 at 9:39 on
source share



All Articles