All pastes #421956 Raw Edit

Untitled

public text v1 · immutable
·published 2007-04-03 04:18 UTC
rendered paste body
#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);
	}
}