Как сделать поиск файлов на диске/дисках?
Рассмотрим два примера программы поиска файла по всему диску и даже по всем дискам с учетом маски:
Пример 1
Uses DOS,CRT;
var
Stop:boolean;
Procedure FileFind(Dir,FindName : PathStr);
Procedure SearchDir(Dir : PathStr);
Var
SRec : SearchRec;
i:integer;
begin
if Stop then Exit;
if Dir[Length(Dir)] <> '\' then Dir := Dir+'\';
ClrEol;
Write(Dir,#13);
if KeyPressed then Stop := ReadKey = #27;
FindFirst(Dir + FindName, AnyFile, SRec);
While DosError = 0 do
begin
With SRec do
if Attr and (VolumeID + Directory) = 0 then
WriteLn(Dir + Name);
FindNext(SRec);
end;
FindFirst(Dir+'*.*', $17, 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
Stop:=False;
SearchDir(Dir);
end;
function GetCurDrive: Char;
var
r: Registers;
begin
r.ah := $19;
MSDOS(r);
GetCurDrive := Char(r.al + $41);
end;
procedure SetCurDrive(Drive: Char);
var
r: Registers;
begin
r.ah := $0E;
r.dl := Byte(Drive) - $41;
MSDOS(r);
end;
procedure WalkDrives(Name : String);
var
SaveDrive, Drive, Ch: Char;
begin
if Pos('.', Name) = 0 then Name := Name + '*.*';
SaveDrive := GetCurDrive;
for Ch := 'C' to 'Z' do
begin
SetCurDrive(Ch);
Drive := GetCurDrive;
if Drive = Ch then
begin
FileFind(Drive + ':\',Name);
if Stop then Break;
end;
end;
SetCurDrive(SaveDrive);
end;
begin
FileFind('C:','*.bak'); {search *.bak in C:}
WalkDrives('*.pas'); {search *.pas in all drives}
end.
Пример 2
Uses DOS;
Procedure PrintFiles(path,mask:string);
var sr:searchrec;
begin
findfirst(path+mask,anyfile-directory,sr);
while doserror=0 do begin
writeln(path+sr.name);
findnext(sr);
end;
end;
Procedure SearchFiles(path,mask:string);
var sr:searchrec;
begin
PrintFiles(path,mask);
findfirst(path+'*.*',anyfile,sr);
while doserror=0 do begin
if (sr.attr and directory=directory) and
(sr.name<>'.') and (sr.name<>'..') then
SearchFiles(path+sr.name+'\',mask); { Рекурсивный вызов }
findnext(sr);
end;
end;
begin
SearchFiles('C:\','*.PAS');
{ WriteFiles('D:\GAMES\','d??.?e?');
writeFiles('e:\','*.*');}
end.