Поиск файла по контрольной сумме (хэшу) - 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) Вывод результатов поиска, включая совпадения и полный путь к найденным файлам.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы