#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
/*
* 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 <topdir>\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);
}
}