Jump to content

Recommended Posts

Posted

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

Posted

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.