rfplay Posted May 13, 2009 at 08:55 PM Report #263963 Posted May 13, 2009 at 08:55 PM Olá a todos, será que alguem me pode dar umas luzes ou mesmo mostrar alguns exemplos de código de modo a que eu possa comparar a estrutura de duas directorias em localizações diferentes no computador? A operação de comparação deverá indicar aspectos como: Para ficheiros com o mesmo nome deve identificar diferenças em data de modificação,em tamanho e em localização relativa. Isto é o que tenho até agora (para quem quiser testar). Tenho dúvidas em como será a melhor maneira de fazer a comparação destes ficheiros listados... #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <unistd.h> #include <time.h> #include <errno.h> #include <string.h> struct compare { char *name; struct dirent *dir; struct stat sb; }; //void dir_compare(struct compare *comp1, int size1, struct compare *comp2,int size2); int stat(const char *path, struct stat *buf); void listardir(char * directorio1, char *directorio2); // Implementação Linux int main() { char *dir1,*dir2; dir1=(char*)malloc(100*sizeof(char)); // Aloca memória dinamicamente dir2=(char*)malloc(100*sizeof(char)); printf("Comparação de directórios e ficheiros\n"); printf("Introduza o 1º directório:\n"); scanf("%s",dir1); printf("Introduza o 2º directório:\n"); scanf("%s",dir2); listardir(dir1,dir2); exit(EXIT_SUCCESS); } void listardir(char * directorio1, char* directorio2) { DIR *dirp; struct dirent *direntp; struct dirent **namelist; struct stat sb; char *str; char name[200]; int i; int size1=0,size2=0; size1=scandir(directorio1,&namelist,0,alphasort); struct compare *comp1[size1]; // DIRECTORIO 1 // abre o directorio printf("\t--------------------------Dir1----------------------------\n"); if ((dirp = opendir( directorio1)) == NULL) { perror(directorio1); exit(2); } i=0; while ((direntp = readdir(dirp)) != NULL) { //le o directorio sprintf(name,"%s/%s",directorio1,direntp->d_name); if (lstat(name, &sb)==-1) { // testar com stat() perror("lstat ERRO!"); exit(3); } if (S_ISREG(sb.st_mode)) { str = "Ficheiro Regular"; } else if (S_ISDIR(sb.st_mode)) { str = "Directório"; } else { str = "Outro"; } printf("%-25s - %s\n",direntp->d_name,str); printf("\tÚltima alteração de status: %s\n", ctime(&(sb.st_ctime))); printf("\tÚltimo acesso: %s\n", ctime( &(sb.st_atime))); printf("\tÚltima modificação: %s\n", ctime( &(sb.st_mtime))); // introduz na estrutura os dados para a posteriori comparar os directorios /* comp1[i]->name=directorio1; */ /* comp1[i]->dir=direntp; */ /* comp1[i]->sb=sb; */ } closedir(dirp); size2=scandir(directorio2,&namelist,0,alphasort); struct compare *comp2[size2]; // DIRECTORIO 2 printf("\t--------------------------Dir----------------------------\n"); if ((dirp = opendir( directorio2)) == NULL) { perror(directorio1); exit(2); } i=0; while ((direntp = readdir(dirp)) != NULL) { sprintf(name,"%s/%s",directorio2,direntp->d_name); if (lstat(name, &sb)==-1) { // testar com stat() perror("lstat ERRO!"); exit(3); } if (S_ISREG(sb.st_mode)) { str = "regular file"; } else if (S_ISDIR(sb.st_mode)) { str = "directory"; } else { str = "other"; } printf("%-25s - %s\n",direntp->d_name,str); printf("\tÚltima alteração de status: %s\n", ctime(&(sb.st_ctime))); printf("\tÚltimo acesso: %s\n", ctime( &(sb.st_atime))); printf("\tÚltima modificação: %s\n", ctime( &(sb.st_mtime))); // introduz na estrutura os dados para a posteriori comparar os directorios /* comp2[i]->name=directorio2; */ /* comp2[i]->dir=direntp; */ /* comp2[i]->sb=sb; */ } //compare(comp1,size1,comp2,size2); } /* void dir_compare(struct compare *comp1,int size1, struct compare *comp2,int size2){ */ /* int i=0,j; */ /* printf("----------------- LISTAGEM DE COMPARAÇÕES ---------------------\n"); */ /* while(i<size1){ */ /* j=0; */ /* while(j<size2){ */ /* if(strcmp(comp1[i]->dir->d_name,comp2[j]->dir->d_name)== 0){ */ /* printf("Directorio: %s\n",comp1[i]->name); */ /* printf("Nome: %s\n",comp1[i]->dir->d_name); */ /* printf("Directorio: %s\n",comp2[j]->name); */ /* printf("Nome: %s\n",comp2[j]->dir->d_name); */ /* printf("\tÚltima alteração de status: %s\n", ctime(&(comp2[j]->sb.st_ctime))); */ /* printf("\tÚltimo acesso: %s\n", ctime( &(comp2[j]->sb.st_atime))); */ /* printf("\tÚltima modificação: %s\n", ctime( &(comp2[j]->sb.st_mtime))); */ /* } */ /* j++; */ /* } */ /* i++; */ /* } */ /*}*/ O output não é o mais trabalhado ainda,está um pouco confuso,mas para perceberem podem testar utilizando apenas um directorio,e depois o outro. FIZ UM UPDATE AO CÓDIGO...devo estar perto. Desde já um obrigado. Ricardo
rfplay Posted May 16, 2009 at 03:12 PM Author Report #264624 Posted May 16, 2009 at 03:12 PM hmmm como poderei fazer uma chamada de sistema para comparar os dois directórios ? uso a função system() ? ou execl() ? para fazer algo do género,p.ex: system ("diff -usd $directorio1 $directorio2") ?? obrigado..
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now