• Paranoid - курс по анонимности и безопасности в сети от команды codeby. Защита персональных данных, анонимность в сети интернет, настройка виртуальных машин, безопасная передача данных, анти форензика и еще много всего полезного. Подробнее ...

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

  • Автор темы Buslove
  • Дата начала
Статус
Закрыто для дальнейших ответов.
B

Buslove

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

lazybiz

Well-known member
03.11.2010
1 339
0
#2
в частности нужно сравнить имена файлов
Сравнить две строки можно так:
C++:
StrCmpI( filename1, filename2 ) == 0 // одинаковые
проверить одинаковые ли контрольные суммы
С контрольными суммами все намного сложнее. Хотя я знаю один трюк, открою для тебя его по-секрету:
C++:
 if ( file1_crc == file2_crc ) { контрольные суммы одинаковые }
 
Статус
Закрыто для дальнейших ответов.