Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

Утечка памяти при поиске файлов.   Найти похожие ветки 

 
pargo ©   (2006-02-18 18:04) [0]

Здравствуйте !
Для поиска файлов использую следующую процедуру:

procedure FindMaskFilesRec(const PrimaryPath,Mask:string;List:TStrings);
var
Source:string;      
SearchRec:TSearchRec;
begin
FindFirst(PrimaryPath+"*",faAnyFile,SearchRec);
if MatchesMask(SearchRec.Name,Mask) then
 if not((SearchRec.Attr and faDirectory)=faDirectory) then
  begin
   Source:=PrimaryPath+ExtractFileName(SearchRec.Name);
   List.Add(Source);
  end;
while FindNext(SearchRec)=0 do
 if MatchesMask(SearchRec.Name,Mask) then
  if not((SearchRec.Attr and faDirectory)=faDirectory) then
   begin
    Source:=PrimaryPath+ExtractFileName(SearchRec.Name);
    List.Add(Source);
   end;
SysUtils.FindClose(SearchRec);
FindFirst(PrimaryPath+"*",faAnyFile,SearchRec);
if ((SearchRec.Attr and faDirectory)=faDirectory)
 and(SearchRec.Name<>".")
 and(SearchRec.Name<>"..") then FindMaskFilesRec(PrimaryPath+SearchRec.Name+PathDelim,Mask,List);
while FindNext(SearchRec)=0 do
 if ((SearchRec.Attr and faDirectory)=faDirectory)
  and(SearchRec.Name<>".")
  and(SearchRec.Name<>"..") then FindMaskFilesRec(PrimaryPath+SearchRec.Name+PathDelim,Mask,List);
SysUtils.FindClose(SearchRec);
end;


При ее использовании происходит утечка памяти.
Не могу понять почему. Вроде все освобождается...
Подскажите, что надо в процедуре исправить, чтобы избежать этого.


 
Palladin ©   (2006-02-18 18:07) [1]

:) ну а то что List заполняется ты не учитываешь?


 
pargo ©   (2006-02-18 18:13) [2]

Учитываю. Ставлю маску так, чтобы файлы не находились.
Все равно память растет, причем размер прироста зависит от
количества перебираемых файлов. :(((


 
Palladin ©   (2006-02-18 18:17) [3]

попробуй эту

Procedure vtGetFilesList(Const p_strMask,p_strRootPath:String;p_cstrList:TStringList;p_isRecurse:Boolean=False) ;
Var
rSearch:TSearchRec;
cstrDirList:TStringList;
I:Integer;
Begin
If p_isRecurse Then cstrDirList:=TStringList.Create Else cstrDirList:=Nil;
If FindFirst(p_strRootPath+p_strMask,faAnyFile,rSearch)=0 Then
 Repeat
  If (rSearch.Name<>".") and (rSearch.Name<>"..") Then
   If ((rSearch.Attr and faDirectory)=faDirectory) And p_isRecurse
    Then cstrDirList.Add(rSearch.Name)
    Else p_cstrList.Add(p_strRootPath+rSearch.Name)
 Until FindNext(rSearch)<>0;
FindClose(rSearch);
If p_isRecurse Then
 Begin
  For I:=0 To cstrDirList.Count-1 Do vtGetFilesList(p_strMask,p_strRootPath+cstrDirList[i]+"\",p_cstrList,True);
  cstrDirList.Free;
 End;
End;


 
pargo ©   (2006-02-18 18:21) [4]

Сейчас попробую.


 
pargo ©   (2006-02-18 18:30) [5]

Palladin ©   (18.02.06 18:17) [3]
С твоей процедурой все в полном порядке...


 
pargo ©   (2006-02-18 18:41) [6]

Все-таки интересно: что в моей не так ?


 
Anatoly Podgoretsky ©   (2006-02-18 20:21) [7]

А где в твоей FindClose


 
pargo ©   (2006-02-18 23:59) [8]

Anatoly Podgoretsky ©   (18.02.06 20:21) [7]
После каждого FindFirst


 
Джо ©   (2006-02-19 00:13) [9]

> [6] pargo ©   (18.02.06 18:41)
> Все-таки интересно: что в моей не так ?

По меньшей мере, в коде одна ошибка есть: не проверяется результат вызова FindFirst. Дальше даже можно не смотреть, наверняка есть и другие погрешности. Приведи сначала код в порядок, да заодно избавься от дублирования кода.


 
API   (2006-02-19 01:06) [10]

К слову. Я вот думаю, может, выйти с предложением выкинуть try...finally...end из языка в связи с невостребованностью?



Страницы: 1 вся ветка

Текущий архив: 2006.03.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.05 c
2-1142246826
Handle
2006-03-13 13:47
2006.03.26
Цвет пикселя под курсором


6-1134491378
Sysanin
2005-12-13 19:29
2006.03.26
Перехват пакетов


15-1141655648
DVM
2006-03-06 17:34
2006.03.26
Delphi 2006 нет пункта Установить компонент. Че то я торможу.


2-1141744584
Nox321
2006-03-07 18:16
2006.03.26
Как прописать процедуру, где?


15-1141457447
Pazitron_Brain
2006-03-04 10:30
2006.03.26
POP и IMAP