Esercizio 1 Prova Pratica 12-09-11

From Sistemi Operativi
Jump to navigation Jump to search
Siano date due directory del file system.
Il programma deve cercare i file .c e .h presenti nelle due directory evidenziando quali sono presenti in una sola
directory
Es:
$ cmpsource so.1.0 so.1.1
so.1.0/file.c not in so.1.1
so.1.1/head.h not in so.1.0
(L'ordine delle segnalazioni in output non e' importante).

Soluzione di Pierg e Quadrelli

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>

/*funzione per avere l'estensione del file*/
const char *get_filename_ext(const char *filename) {
    const char *dot = strrchr(filename, '.');
    if(!dot || dot == filename) return "";
    return dot + 1;
}

/*funzione per comparare tutti i file tra una e l'altra directory*/
void cmp(char *path1,char *path2){
	DIR *dir1,*dir2;
	struct dirent *f1,*f2;
	int bol;
	if((dir1=opendir(path1))==NULL){
		perror("ERRORE DIR1");
		exit(-1);
	}
	while((f1=readdir(dir1))!=NULL){
		bol=0;
		if(strcmp(get_filename_ext(f1->d_name),"c")==0 || strcmp(get_filename_ext(f1->d_name),"h")==0){
			if((dir2=opendir(path2))==NULL){
				perror("ERRORE DIR2");
				exit(-1);
			}
			while((f2=readdir(dir2))!=NULL){
				if(strcmp(f1->d_name,f2->d_name)==0){
					bol=1;
					break;
				} 
			}
			closedir(dir2);
			if(!bol){
				printf("%s/%s not in %s\n",path1,f1->d_name,path2);
			}
		}
	}
	closedir(dir1);
}

/*main del programma*/
int main (int argc, char *argv[]){
	if(argc!=3){
		perror("PARAMETRI ERRATI");
		exit(-1);
	}
	cmp(argv[1],argv[2]);
	cmp(argv[2],argv[1]);
return 0;
}