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