• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

rfplay

comparação de directórios e seus ficheiros

2 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora