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.