Пытаюсь написать ftp-сервер в Linux. В этом вопросе, как я могу перечислить файлы в каталоге на терминале с помощью программы C? Возможно, я могу использовать функцию exec для запуска команды поиска, но мне нужно имя файла в виде строки для отправки клиентской программы. Как я могу это сделать?
Спасибо за ответы.
png
файлы?Одно крошечное дополнение к ответу Дж. Б. Янсена - в основном
readdir()
цикле я бы добавил следующее:if (dir->d_type == DT_REG) { printf("%s\n", dir->d_name); }
Просто проверяю, действительно ли это файл, а не (символьная) ссылка, каталог или что-то еще.
ПРИМЕЧАНИЕ: подробнее
struct dirent
вlibc
документации .источник
d_type
, но Linux и BSD будут (я знаю, что вопрос помечен как Linux, просто немного расширяю ответ); даже в этом случае не все файловые системы поддерживаются единообразно , однако он должен работать с большинством FS.Вот полная программа, как рекурсивно перечислить содержимое папки:
#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); }
источник
Приведенный ниже код будет печатать файлы только в каталоге и исключать каталоги в данном каталоге при обходе.
#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); }
источник