Próbuję napisać serwer ftp na Linuksie. W tej sprawie, jak mogę wyświetlić listę plików w katalogu na terminalu przez program C? Może mogę użyć funkcji exec, aby uruchomić polecenie find, ale chcę, aby nazwa pliku była ciągiem, aby wysłać program klienta. Jak mogę to zrobić?
Dzięki za odpowiedzi.
png
plików?Mały dodatek do odpowiedzi JB Jansena - w głównej
readdir()
pętli dodałbym to:if (dir->d_type == DT_REG) { printf("%s\n", dir->d_name); }
Po prostu sprawdzam, czy to naprawdę plik, a nie (sym) link, katalog lub cokolwiek innego.
UWAGA: więcej informacji
struct dirent
wlibc
dokumentacji .źródło
d_type
, ale Linux i BSD tak (wiem, że pytanie jest oznaczone tagiem Linux, tylko trochę rozszerzę odpowiedź); nawet wtedy nie wszystkie systemy plików są obsługiwane jednolicie , jednak powinno działać z większością FS.Oto kompletny program do rekurencyjnego wyświetlania zawartości folderu:
#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); }
źródło
Poniższy kod wydrukuje tylko pliki w katalogu i wykluczy katalogi w podanym katalogu podczas przeglądania.
#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); }
źródło