Authorization

program search_file;

uses dos,crt,search,utils;

var dir:string;
name:shortstr;
ext:extstring;
dir_array:array[1..11] of pntstring;
t:integer;
i,num:byte;
ch:char;
FResult:TResult;

function not_find(wr:boolean):boolean;
var t:byte;
find:boolean;

procedure dir_processing(var dir:string);
var search:searchrec;
begin
if byte(dir[0])=1 then dir:=dir+':'
else if (dir[byte(dir[0])]='/') or (dir[byte(dir[0])]='\') then
 dec(dir[0]);
if fileExists(dir+'\*.*') then find:=true
else dir:='*'+dir;
end;

begin
i:=1;
if (dir='') or (dir='all') then
 begin
 not_find:=false;
 if dir_array[1]=nil then new(dir_array[1]);
 dir_array[1]^:='';
 dir_array[1]^[1]:=' ';
 if wr then writeln('Поиск на всех дисках.');
 exit;
 end;
t:=pos('*',dir);
if t<>0 then
 begin
 find:=false;
 repeat
 if dir_array[i]=nil then new(dir_array[i]);
 dir_array[i]^:=copy(dir,1,t-1);
 delete(dir,1,t);
 t:=pos('*',dir);
 inc(i);
 until t=0;
 if dir_array[i]=nil then new(dir_array[i]);
 dir_array[i]^:=dir;
 for t:=1 to i do dir_processing(dir_array[t]^);
 if not find then
  begin
  not_find:=true;
  writeln('Ни одной из указанных директорий не существует. Повтори ввод.');
  end
 else not_find:=false;
 end
else
 begin
 if dir_array[1]=nil then new(dir_array[1]);
 dir_array[1]^:=dir;
 dir_processing(dir_array[1]^);
 if not find then
  begin
  not_find:=true;
  writeln('Указанной директории не существует. Повтори ввод.');
  end
 else not_find:=false;
 end;
end;

function ext_error(var ext:string):boolean;
begin
if (ext='any') or (ext='ANY') then ext:='.**'
else if (ext='file') or (ext='FILE') then ext:='.*'
else if (ext='folder') or (ext='FOLDER') then ext:=''
else ext:='.'+ext;
if byte(ext[0])>4 then
 begin
 ext_error:=true;
 writeln('Длина расширения должна быть не более 3 символов. Повтори ввод:');
 end
else ext_error:=false;
end;

function read_ext:extstring;
var ext:string;
begin
repeat
readln(ext);
if ext_error(ext) then continue
else
 begin
 if ext='' then writeln('Папка');
 break;
 end;
until false;
read_ext:=ext;
end;

procedure error_message(ch:char);
begin
case ch of
 ' ':writeln('В имени не должно быть пробела. Повтори ввод:');
 '\':writeln('В имени не должно быть символов "\" или "/". Повтори ввод:');
 end;
end;

function name_error(name:string):boolean;
var i,t:byte;
begin
name_error:=false;
if byte(name[0])>8 then
 begin
 writeln('Длина имени должна быть не более 8 символов. Повтори ввод:');
 name_error:=true;
 exit;
 end;
t:=byte(name[0]);
ch:='r';
for i:=1 to t do
 begin
 case name[i] of
  ' ':ch:=' ';
  '/','\':ch:='\';
  end;
 if ch<>'r' then
  begin
  error_message(ch);
  name_error:=true;
  exit;
  end;
 end;
end;

function read_name:shortstr;
var name:string;
begin
readln(name);
while name_error(name) do readln(name);
read_name:=name;
end;

procedure begin_search;
var find:boolean;
hour,minute,second,hund:word;
begin
writeln;
gettime(hour,minute,second,hund);
writeln(hour,'/',minute,'/',second,'/',hund);
writeln('Идет поиск...');
find:=false;
for t:=1 to i do
 if dir_array[t]<>nil then
  if dir_array[t]^[1]<>'*' then
   if SuperSearch(name,dir_array[t]^,ext,num,true,FResult) then find:=true;
if find then writeln('Поиск закончен.')
else
 begin
 writeln('Не найдено ни одного файла, соответствующего');
 writeln(' введенным характеристикам.');
 end;
gettime(hour,minute,second,hund);
writeln(hour,'/',minute,'/',second,'/',hund);
FResult.destroy;
for t:=1 to i do
 begin
 if dir_array[t]<>nil then
  if dir_array[t]^[1]='*' then
   begin
   delete(dir_array[t]^,1,1);
   writeln('Директории '+dir_array[t]^+' не существует.');
   end;
 end;
for t:=1 to 11 do
 if dir_array[t]<>nil then
  begin
  dispose(dir_array[t]);
  dir_array[t]:=nil;
  end;
end;

begin
for t:=1 to 11 do dir_array[t]:=nil;
if ParamCount<>0 then
 begin
 name:=paramstr(1);
 while name_error(name) do readln(name);;
 dir:=paramstr(2);
 while ext_error(dir) do readln(dir);
 ext:=dir;
 dir:=paramstr(3);
 while not_find(false) do readln(dir);
 val(paramstr(4),num,t);
 begin_search;
 end
else
repeat
writeln('   Программа поиска файлов на всех дисках.');
writeln('Вводи данные без кавычек.');
writeln('Введи (без расширения) имя искомого файла или любую его часть:');
writeln('Для поиска файла по части его имени введи символ "*"');
writeln(' перед частью его имени.');
name:=read_name;
writeln('');
writeln('Введи расширение искомого файла. Например, "exe", или "txt".');
writeln('Для поиска только папки');
writeln(' введи "folder" или сразу нажми ENTER.');
writeln('Для поиска файла с любым расширением, кроме папок,');
writeln(' введи "file".');
writeln('Для поиска как среди файлов (с любым расширением), так и среди папок,');
writeln(' введи "any".');
ext:=read_ext;
writeln('');
writeln('Введи директорию или имя диска, где будет производиться поиск.');
writeln('Вы можете ввести несколько директорий для поиска в них. Для этого');
writeln(' введите директории, разделенные символом "*".');
writeln(' Например, C*E:\WINDOWS*A:\FOLDER');
writeln('Для поиска на всех дисках нажми сразу ENTER.');
readln(dir);
while not_find(true) do readln(dir);
writeln('');
writeln('Введи количество возвращаемых файлов (до 11), подходящих');
write(' введенным характеристикам: ');
readln(num);
begin_search;
writeln('Для продолжения поиска нажми ENTER, для выхода - ESC');
repeat
ch:=readkey;
until (ch=#13) or (ch=#27);
until ch=#27;
end.