Saya mencoba menulis server ftp di Linux. Dalam hal ini bagaimana saya dapat membuat daftar file dalam direktori pada terminal dengan program C? Mungkin saya dapat menggunakan fungsi exec untuk menjalankan perintah find tetapi saya ingin nama file sebagai string untuk mengirim program klien. Bagaimana saya bisa melakukan ini?
Terima kasih atas jawabannya.
png
file?Satu tambahan kecil untuk jawaban JB Jansen - di
readdir()
loop utama saya akan menambahkan ini:if (dir->d_type == DT_REG) { printf("%s\n", dir->d_name); }
Hanya memeriksa apakah itu benar-benar file, bukan tautan (sym), direktori, atau apa pun.
CATATAN: lebih lanjut tentang
struct dirent
dalamlibc
dokumentasi .sumber
d_type
, tetapi Linux dan BSD akan (saya tahu pertanyaannya adalah Linux, hanya memperluas jawaban sedikit); meskipun demikian, tidak semua filesystem didukung secara seragam , namun ia harus bekerja dengan kebanyakan FS.Berikut adalah program lengkap cara daftar isi folder secara rekursif:
#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); }
sumber
Kode di bawah ini hanya akan mencetak file dalam direktori dan mengecualikan direktori dalam direktori tertentu saat melakukan traverse.
#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); }
sumber