1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

Помогите с написанием процедуры и оптимизацией кода

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

Статус темы:
Закрыта.
  1. Buslove

    Buslove Гость

    Репутация:
    0
    Всем доброго времени суток! Пишу в первый раз, волнуюсь. Написал программу, которая просматривает папки и выписывает содержимое в два файла, посчитав контрольные суммы. Никак не получается написать процедуру для сравнения этих двух файлов, в частности нужно сравнить имена файлов, и если они совпадают проверить одинаковые ли контрольные суммы.
    вот листинг:
    Код:
    #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;
    }
     
  2. lazybiz

    lazybiz Well-Known Member

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    0
    Сравнить две строки можно так:
    Код:
    StrCmpI( filename1, filename2 ) == 0 // одинаковые
    С контрольными суммами все намного сложнее. Хотя я знаю один трюк, открою для тебя его по-секрету:
    Код:
     if ( file1_crc == file2_crc ) { контрольные суммы одинаковые }
     
  3. Buslove

    Buslove Гость

    Репутация:
    0
    Спасибо .
     
Загрузка...
Похожие Темы - Помогите написанием процедуры
  1. morpheus
    Ответов:
    0
    Просмотров:
    1.783
  2. ~localhost
    Ответов:
    2
    Просмотров:
    82
  3. citizenfour
    Ответов:
    1
    Просмотров:
    69
  4. Tayrus
    Ответов:
    1
    Просмотров:
    80
  5. Lcf11
    Ответов:
    2
    Просмотров:
    88
Статус темы:
Закрыта.

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