Difference between revisions of "Esercizio 1 Prova Pratica 12-09-11"

From Sistemi Operativi
Jump to navigation Jump to search
(Created page with "<source lang="text"> 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 so...")
 
 
Line 12: Line 12:
 
<source lang="c">
 
<source lang="c">
 
#include <stdio.h>
 
#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;#include <stdio.h>
 
 
#include <stdlib.h>
 
#include <stdlib.h>
 
#include <errno.h>
 
#include <errno.h>
Line 48: Line 30:
 
struct dirent *f1,*f2;
 
struct dirent *f1,*f2;
 
int bol;
 
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;
 
}
 
 
if((dir1=opendir(path1))==NULL){
 
if((dir1=opendir(path1))==NULL){
 
perror("ERRORE DIR1");
 
perror("ERRORE DIR1");

Latest revision as of 12:06, 14 April 2015

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;
}