строковое сравнение файлов в С

Тема в разделе "C/C++/C#", создана пользователем Buslove, 19 янв 2011.

  1. Buslove

    Buslove Гость

    Здравствуйте! Написал программу для сверки версий. Просматривает первый каталог с подкаталогами, выписывает содержимое в файл и подсчитывает контрольные суммы, то же делает и для второго каталога. Не получается написать процедуру сравнения содержимого полученных двух файлов. В частности совпавшие названия файлов и сверить их контрольные суммы.
    Код (Text):
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <dirent.h>
    #include <sys/stat.h>
    #include <sys/types.h>
    #include <sys/param.h>
    #include <string.h>

    //Максимальная длина пути к файлам
    //#define MAXPATHLEN 512
    //Максимальное количество файлов
    #define MAXCOUNTFILE 1024

    //Структура записи информации о обработанных файлах
    typedef struct
    {
    //Путь к файлу
    char FileDirectory[MAXPATHLEN];
    //Контрольная сумма файла
    int CRC32;

    } FileRecord;

    //Массив обработанных файлов старого проекта
    FileRecord OldProjectFiles[MAXCOUNTFILE];
    //Массив обработанных файлов нового проекта
    FileRecord NewProjectFiles[MAXCOUNTFILE];

    //Массив флагов файлов уже сравненных
    unsigned char FilesCompareFlags[MAXCOUNTFILE];

    //Количество файлов в старом проекте (длинна массива OldProjectFiles)
    unsigned short int LenOldProjectFiles;
    //Количество файлов в новом проекте (длинна массива NewProjectFiles)
    unsigned short int LenNewProjectFiles;

    void GetTreeFile (char Directory[MAXPATHLEN], FileRecord ProjectFiles[MAXCOUNTFILE], unsigned short int *Len)
    {
    struct stat DirInfo;
    struct dirent *Files;
    DIR *DirIn;
    char FullName[MAXPATHLEN];
    struct stat FileInfo;

    if (lstat (Directory, &DirInfo) < 0)
    {
    return;
    }

    if( !S_ISDIR (DirInfo.st_mode))
    {
    return;
    }

    DirIn = opendir (Directory);

    if (DirIn == NULL)
    {
    return;
    }

    while ((Files = readdir (DirIn)) != NULL)
    {
    sprintf (FullName, "%s/%s", Directory, Files->d_name );

    if (lstat (FullName, &FileInfo) < 0)
    {
    perror (FullName);
    }
    if (S_ISDIR (FileInfo.st_mode))
    {
    //Получаем длину строки
    int TempLen = strlen(FullName);
    //И проверяем не является ли последний символ ".", что бы исключить папки "/.." и "/."
    if (FullName[TempLen - 1] != '.')
    {
    GetTreeFile(FullName, ProjectFiles, Len);
    }
    //printf ("Directory: %s\n", FullName);
    }
    else
    {
    if (S_ISREG (FileInfo.st_mode))
    {
    ProjectFiles[*Len].CRC32 = 0;
    strcpy (ProjectFiles[*Len].FileDirectory, FullName);
    *Len = *Len + 1;
    }
    }
    }
    closedir (DirIn);
    return;
    }

    int GetCRC32 (unsigned char *Buf, int Len)
    {
    int CRC_TABLE[256];
    int CRC;
    int i;
    int j;

    for ( i = 0; i < 256; i++)
    {
    CRC = i;
    for (j = 0; j < 8; j++)
    {
    CRC = CRC & 1 ? (CRC >> 1) ^ 0xEDB88320UL : CRC >> 1;
    }
    CRC_TABLE[i] = CRC;
    };

    CRC = 0xFFFFFFFFUL;

    while (Len--)
    {
    CRC = CRC_TABLE[(CRC ^ *Buf++) & 0xFF] ^ (CRC >> 8);
    }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            

    return CRC ^ 0xFFFFFFFFUL;
    }

    void SetFilesCRC32 (FileRecord ProjectFiles[MAXCOUNTFILE], unsigned short int Len)
    {
    //Цикл по всем записям массива файлов
    int i;
    long int FileSize;
    unsigned char *Buf;
    for (i = 0; i < Len - 1; i++)

    {
    FILE *MyFile;

    //Открываем i-й файл

    MyFile = fopen(ProjectFiles[i].FileDirectory, "r");

    //Переводим указатель позиции файла в его конец
    fseek (MyFile, 0L, SEEK_END);

    //Получаем размер файла
    FileSize = ftell(MyFile);

    fseek (MyFile, 0L, SEEK_SET);

    Buf = malloc(FileSize);

    fread (Buf, 1, FileSize, MyFile);

    ProjectFiles[i].CRC32 = GetCRC32 (Buf, FileSize);

    free(Buf);

    fclose (MyFile);
    }
    }
    /* void SravnFile()
    {
    //Строка сравнения
    char IdentStr[MAXPATHLEN];
    unsigned char StrFlag[MAXCOUNT];


    } */
    int main (void)
    {
    FILE *IdentOld;
    FILE *IdentNew;
    int i;
    int j;  
    //Путь к папке со старой версией программы
    char DirectoryOld[MAXPATHLEN];

    //Путь к папке с новой версией программы
    char DirectoryNew[MAXPATHLEN];

    printf("Введите путь к старой версии ");
    scanf("%s", DirectoryOld);


    printf("Введите путь к новой версии ");
    scanf("%s", DirectoryNew);

    //Построение таблицы файлов старого проекта
    LenOldProjectFiles = 0;
    GetTreeFile (DirectoryOld, OldProjectFiles, &LenOldProjectFiles);

    //Построение таблицы файлов нового проекта
    LenNewProjectFiles = 0;
    GetTreeFile(DirectoryNew, NewProjectFiles, &LenNewProjectFiles);


    SetFilesCRC32 (OldProjectFiles, LenOldProjectFiles);

    SetFilesCRC32 (NewProjectFiles, LenNewProjectFiles);

    IdentOld = fopen("identOld.spo","w+");
    IdentNew = fopen("identNew.spo","w+");

    for ( i = 0; i < LenOldProjectFiles - 1; i++)
    {
    fprintf (IdentOld, "File: %s ", OldProjectFiles[i].FileDirectory);
    fprintf (IdentOld, "KS: %u \n", (OldProjectFiles[i].CRC32));
    }

    for ( j = 0; j < LenNewProjectFiles - 1; j++)
    {
    fprintf (IdentNew, "File: %s ", NewProjectFiles[j].FileDirectory);
    fprintf (IdentNew, "KS: %u \n", (NewProjectFiles[j].CRC32));
    }


    return EXIT_SUCCESS;
    }
     
Загрузка...

Поделиться этой страницей