Поиск файла по контрольной сумме (хэшу) - Free Pascal
Формулировка задачи:
нужно написать программу, которая ищет файл по хэшу, использовать алгоритм CRC32
нам известен хэш файла, который нужно найти в папке среди других файлов
никак не могу найти алгоритм на паскале, кто знает?
Решение задачи: «Поиск файла по контрольной сумме (хэшу)»
textual
Листинг программы
{$mode Delphi}
Uses DOS,crc;
var
scanF: file of byte;
block:byte;
s:searchRec;
CurDir,path,mask:string;
hash:LongWord;
z:integer;
function GetCRC(s : string) : cardinal;
var
bufer:array[0 .. 8191] of byte;
len : integer;
f : file;
IO:byte;
begin
assign(f, s);
{$I-} filemode:=0;reset(f,1); {$I+}
IO := IOresult;
if IO=0 then
begin
result := crc32(0, nil, 0);
repeat
BlockRead(F, bufer, Sizeof(bufer), len);
result:= crc32(result, @bufer, len);
until len = 0;
close(f);
end;
GetCRC:=result;
end;
Procedure FileFind(Dir,FindName : PathStr);
Procedure SearchDir(Dir : PathStr);
Var
SRec:SearchRec;
begin
if Dir[Length(Dir)] <> '\' then Dir := Dir+'\';
FindFirst(Dir + FindName, AnyFile, SRec);
While DosError = 0 do
begin
With SRec do
if Attr and (VolumeID + Directory) = 0 then
if GetCRC(Dir + Name)=hash then
writeln (Dir + Name,' - CRC match found!!!');
FindNext(SRec);
end;
FindFirst(Dir+'*.*', Directory or ReadOnly or Hidden or SysFile, SRec);
While DosError = 0 do
begin
With SRec do
if (Attr and Directory <> 0) and (Name[1] <> '.') then
SearchDir(Dir+Name);
FindNext(SRec);
end;
end;
begin
SearchDir(Dir);
end;
begin
repeat
writeln('1) Take CRC from file',#10,#13,'2) CRC search',#10,#13,'0) exit');
readln(z);
case z of
1:begin
writeln('Enter full path with filename');
readln(path);
hash:=GetCRC(path);
writeln(hash);
end;
2:begin
writeln('Enter full path ');
readln(path);
writeln('Enter mask or filemame with extention ');
readln(mask);
FileFind(path,mask);
end;
end;
until z=0;
end.
Объяснение кода листинга программы
1) Ввод с клавиатуры номера пункта меню: 2) Ввод полного пути файла для вычисления контрольной суммы (хэша): 3) Вычисление контрольной суммы (хэша) файла: 4) Вывод результата вычисления контрольной суммы (хэша): 5) Ввод полного пути для поиска файла: 6) Ввод маски или имени файла с расширением для поиска: 7) Поиск файла по маске или имени файла с расширением: 8) Вывод результатов поиска, включая совпадения и полный путь к найденным файлам.