Помощь - Поиск - Пользователи - Календарь
Полная версия: Переполнение стека при сканировании диска
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Антон Паскаль
Сделал программу, которая ищет файлы по всему диску...
Конечно же стек переполняется(((
Это из-за рекурсии (вложенной процедуры). Помогите пожалуйста сделать эту процедуру динамической!! smile.gif

uses Dos, Crt; type PFind = ^TFind; TFind = object procedure Find_File(Dir,FindName : PathStr); end; var Find : PFind; Procedure TFind.Find_File(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 WriteLn(Dir + Name); FindNext(SRec); end; {Поиск всех вложенных каталогов, в т.ч. скрытых, системных, r/o} 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 clrscr; New(Find); Find^.Find_File('c:\','*.pas'); Dispose(Find); readkey; end.


Добавлено через 1 мин.
блин...... как сделать код.....чтобы красиво было?

Добавлено через 33 сек.
uses Dos, Crt;

type
PFind = ^TFind;
TFind = object
procedure Find_File(Dir,FindName : PathStr);
end;
var Find : PFind;
Procedure TFind.Find_File(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
WriteLn(Dir + Name);
FindNext(SRec);
end;
{Поиск всех вложенных каталогов, в т.ч. скрытых, системных, r/o}
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
clrscr;
New(Find);
Find^.Find_File('c:\','*.pas');
Dispose(Find);
readkey;
end.

Добавлено через 8 мин.

uses Dos, Crt;

type
PFind = ^TFind;
TFind = object
procedure Find_File(Dir,FindName : PathStr);
end;
var Find : PFind;
Procedure TFind.Find_File(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
WriteLn(Dir + Name);
FindNext(SRec);
end;
{Поиск всех вложенных каталогов, в т.ч. скрытых, системных, r/o}
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
clrscr;
New(Find);
Find^.Find_File('c:\','*.pas');
Dispose(Find);
readkey;
end.

IUnknown
Я показывал, что можно сделать в таких случаях: вот отсюда и ниже внимательно прочитай: Работа с файлами , там та же проблема что и у тебя, и 2 варианта решения
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.