#include #include #include #include #include #include #include /* * Sfind - Simple find... * * Denna har några begränsningar, varvid den största är att ifall man inte har tillgång * till att öppna/läsa i en katalog, så får vi segmentation fault eftersom att den försöker * öppna en katalog den inte har tillgång till, osv. I övrigt fungerar den. * Och anger vi en katalog utan / på slutet, så lgger den på detta innan den körs.. * * Jonas Nilsson, Simon Lindgren, MdH 2007. */ int main (int argc, char* argv[]) { int i; char* dir; DIR* dirp; struct dirent *dp; if (argc == 1) { printf("\nUsage: ./sfind \n\n"); } else { dir = argv[1]; recursive(dir); printf("--------------------------------------------------\n"); } } int recursive(char* topdir) { DIR* dirp2; struct dirent *dp2; char fulldir[50]=""; char topdir2[50]=""; strcpy(topdir2, topdir); int len; len = strlen(topdir); // lägg på / på slutet om inte detta tecken är sist på det man fått in : if(strcmp(&topdir[len-1], "/") != 0) { sprintf(topdir2, "%s/", topdir2); } dirp2 = opendir(topdir2); if ((dp2=readdir(dirp2)) != NULL) { while(dp2 != NULL) { if (strcmp(dp2->d_name, ".") == 0 || strncmp(dp2->d_name, "..", 2) == 0) { // skriv inte ut . och .. "katalogerna" } else { // skriv ut resten printf("%s%s\n", topdir2, dp2->d_name); } // om det är ett dir: if (dp2->d_type == DT_DIR) { if (strcmp(dp2->d_name, ".") == 0 || strncmp(dp2->d_name, "..", 2) == 0) { // Gör ingenting, detta är ju . och .. katalogerna, dessa vill vi // inte göra något med ... } else { // Här skall vi anropa denna funktion igen rekursivt, för att skriva // ut innehållet i den aktuella katalogen, och dess filer/undermappar ... sprintf(fulldir, "%s%s", topdir2, dp2->d_name); sprintf(fulldir, "%s/", fulldir); recursive(fulldir); } } dp2 = readdir(dirp2); } closedir(dirp2); } }