Поиск файла по контрольной сумме (хэшу) - Free Pascal

Узнай цену своей работы

Формулировка задачи:

нужно написать программу, которая ищет файл по хэшу, использовать алгоритм CRC32 нам известен хэш файла, который нужно найти в папке среди других файлов никак не могу найти алгоритм на паскале, кто знает?

Решение задачи: «Поиск файла по контрольной сумме (хэшу)»

textual
Листинг программы
  1. {$mode Delphi}
  2. Uses DOS,crc;
  3. var
  4.   scanF: file of byte;
  5.   block:byte;
  6.   s:searchRec;
  7.   CurDir,path,mask:string;
  8.   hash:LongWord;
  9.   z:integer;
  10.  
  11. function GetCRC(s : string) : cardinal;
  12. var
  13.   bufer:array[0 .. 8191] of byte;
  14.   len : integer;
  15.   f : file;
  16.   IO:byte;
  17. begin
  18.   assign(f, s);
  19.   {$I-} filemode:=0;reset(f,1); {$I+}
  20.   IO := IOresult;
  21.   if IO=0 then
  22.   begin
  23.     result := crc32(0, nil, 0);
  24.      repeat
  25.       BlockRead(F, bufer, Sizeof(bufer), len);
  26.       result:= crc32(result, @bufer, len);
  27.      until len = 0;
  28.     close(f);
  29.   end;
  30.   GetCRC:=result;
  31. end;
  32.  
  33. Procedure FileFind(Dir,FindName : PathStr);
  34.  Procedure SearchDir(Dir : PathStr);
  35.  Var
  36.    SRec:SearchRec;
  37.  begin
  38.    if Dir[Length(Dir)] <> '\' then Dir := Dir+'\';
  39.    FindFirst(Dir + FindName, AnyFile, SRec);
  40.    While DosError = 0 do
  41.      begin
  42.        With SRec do
  43.         if Attr and (VolumeID + Directory) = 0 then
  44.          if GetCRC(Dir + Name)=hash then
  45.           writeln (Dir + Name,' - CRC match found!!!');
  46.         FindNext(SRec);
  47.      end;
  48.    FindFirst(Dir+'*.*', Directory or ReadOnly or Hidden or SysFile, SRec);
  49.    While DosError = 0 do
  50.      begin
  51.        With SRec do
  52.         if (Attr and Directory <> 0) and (Name[1] <> '.')  then
  53.          SearchDir(Dir+Name);
  54.        FindNext(SRec);
  55.      end;
  56.  end;
  57.  
  58. begin
  59.  SearchDir(Dir);
  60. end;
  61.  
  62. begin
  63. repeat
  64.   writeln('1) Take CRC from file',#10,#13,'2) CRC search',#10,#13,'0) exit');
  65.   readln(z);
  66.   case z of
  67.   1:begin
  68.       writeln('Enter full path with filename');
  69.       readln(path);
  70.       hash:=GetCRC(path);
  71.       writeln(hash);
  72.     end;
  73.   2:begin
  74.       writeln('Enter full path ');
  75.       readln(path);
  76.       writeln('Enter mask or filemame with extention ');
  77.       readln(mask);
  78.       FileFind(path,mask);
  79.     end;
  80.     end;
  81. until z=0;
  82. end.

Объяснение кода листинга программы

1) Ввод с клавиатуры номера пункта меню: 2) Ввод полного пути файла для вычисления контрольной суммы (хэша): 3) Вычисление контрольной суммы (хэша) файла: 4) Вывод результата вычисления контрольной суммы (хэша): 5) Ввод полного пути для поиска файла: 6) Ввод маски или имени файла с расширением для поиска: 7) Поиск файла по маске или имени файла с расширением: 8) Вывод результатов поиска, включая совпадения и полный путь к найденным файлам.

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


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

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

12   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы