Программа, которая обнаруживает дубликаты - PullRequest
0 голосов
/ 08 января 2019

Моя программа должна обнаружить дубликаты в заданном файле и заменить их жесткими ссылками. Он отлично работает на Windows (без ссылок), но не работает на Linux. Для 5 файлов в папке результаты: Список и результаты . Он корректно обнаруживает дубликаты на окнах, но эти NULL, вероятно, тормозят его на Linux. Я попытался добавить, если в конце listFiles (неактивен с //) он создает хороший список, но не обнаруживает 2-й дубликат на окнах (не тестировался на Linux). Кстати, я упоминал косые черты внизу, но обратите внимание Спасибо за помощь.

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

int compare(char *file_1, char *file_2);
int listFiles(char *path, int *count, char ***list);
int hardlink (char *path_1, char *path_2);
int is_regular_file(const char *path);

int main()
{
    char path[100];
    int count=0;
    int comp=0;
    char **list=NULL;
    printf("input path: ");
    scanf("%s", path);
    count=listFiles(path,&count,&list);
    printf("%d\n",count);
    if(list==NULL){
        printf("wrong path");
        return 1;
    }
    for(int i=0;i<count;++i)
    {
        printf("%d %s\n",i,list[i]);
    }
    for (int i=0; i<count; ++i){
        for (int j=i+1; j<count; ++j){
            comp= compare(list[i], list[j]);
            if(comp==0&&list[j]!=NULL&&list[i]!=NULL){
                    printf("%s to dup %s\n",list[j],list[i]);
            //        hardlink (list[i], list[j]);
            for(int k=j ;k<count-1;++k){
                list[k]=list[k+1];
            }
            free(list[count]);
            --count;
            }
        }
    }
    for (int i = 0; i < count; ++i)
        free(list[i]);
    free(list);
    return 0;
}
int listFiles(char *basePath,int *count, char ***list)
{
    char path[1000];
    int temp=*count;
    struct dirent *dp;
    DIR *dir = opendir(basePath);
    if (!dir){
        return temp;
    }
    while ((dp = readdir(dir)) != NULL){
        if (strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0){
            strcpy(path, basePath);
            strcat(path, "/");
            strcat(path, dp->d_name);
            char *file_path=NULL;
            if (is_regular_file(path)){
            int x=0;
                for( int i =0;path[i]!='\0';++i){
                    file_path=realloc(file_path, (x+1)*sizeof(*file_path));
                    (file_path)[x++] = path[i];
                }
                file_path=realloc(file_path, (x+1)*sizeof(*file_path));
                file_path[x]='\0';
            }
         //   if(file_path!=NULL){
                *list=realloc(*list, (temp+1)*sizeof(**list));
                (*list)[temp++] = file_path;
        //    }
        }
        temp=listFiles(path,&temp,list);
    }
    closedir(dir);
    return temp;
}
int compare(char *file_1, char *file_2)
{
    FILE *data_1 = fopen(file_1,"r");
    FILE *data_2 = fopen(file_2,"r");
    char *temp_1=malloc(10000);
    char *temp_2=malloc(10000);
    if (data_1){
            int x=0;
            int c;
            while ((c = fgetc(data_1)) != EOF){
               (temp_1)[x++] = (char) c;
            }
            temp_1[x] = '\0';
            }
    if (data_2){
            int x=0;
            int c;
            while ((c = fgetc(data_2)) != EOF){
               (temp_2)[x++] = (char) c;
            }
            temp_2[x] = '\0';
            }
            fclose(data_1);
            fclose(data_2);
    if(strcmp(temp_1,temp_2)==0)return 0;
    else return 1;
}
int hardlink (char *path_1, char *path_2){
    int temp= remove(path_2);
    if (temp==0)printf("file %s deleted\n", path_2);
    else {
            printf("can't delete %s\n", path_2);
            return 1;
    }
    int linking = link ( path_1 , path_2 ) ;
    if (linking == 0){
        FILE *fil = fopen (path_2, "r");
        if (fil != NULL){
                printf (" hardlink %s for %s created\n",path_2,path_1);
                fclose(fil);
        }
        else printf("can't create hardlink %s\n", path_2);
        return 0;
    }
    else printf("can't create hardlink %s\n", path_2);
    puts("");
    return 0;
}
int is_regular_file(const char *path)
{
    struct stat path_stat;
    stat(path, &path_stat);
    return S_ISREG(path_stat.st_mode);
}

в списке файлов вам нужно изменить strcat (путь, "\"); strcat (путь, "/"); если вы хотите работать на Linux

1 Ответ

0 голосов
/ 08 января 2019

вы используете strcat(path, "\\"); для Linux и Windows. Разделитель пути не совпадает.

const char separator =
#ifdef _WIN32
                        '\\';
#else
                        '/';
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...