![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Утечка памяти при поиске файлов.
pargo © (2006-02-18 18:04:00)Здравствуйте !
Для поиска файлов использую следующую процедуру:
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;
При ее использовании происходит утечка памяти.
Не могу понять почему. Вроде все освобождается...
Подскажите, что надо в процедуре исправить, чтобы избежать этого.
API (2006-02-19 01:06:00) [1]К слову. Я вот думаю, может, выйти с предложением выкинуть try...finally...end из языка в связи с невостребованностью?
Джо (2006-02-19 00:13:00) [2]> [6] pargo © (18.02.06 18:41)
> Все-таки интересно: что в моей не так ?
По меньшей мере, в коде одна ошибка есть: не проверяется результат вызова FindFirst. Дальше даже можно не смотреть, наверняка есть и другие погрешности. Приведи сначала код в порядок, да заодно избавься от дублирования кода.
pargo (2006-02-18 23:59:00) [3]Anatoly Podgoretsky © (18.02.06 20:21) [7]
После каждого FindFirst
Anatoly Podgoretsky (2006-02-18 20:21:00) [4]А где в твоей FindClose
pargo (2006-02-18 18:41:00) [5]Все-таки интересно: что в моей не так ?
pargo (2006-02-18 18:30:00) [6]Palladin © (18.02.06 18:17) [3]
С твоей процедурой все в полном порядке...
pargo (2006-02-18 18:21:00) [7]Сейчас попробую.
Palladin (2006-02-18 18:17:00) [8]попробуй эту
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:13:00) [9]Учитываю. Ставлю маску так, чтобы файлы не находились.
Все равно память растет, причем размер прироста зависит от
количества перебираемых файлов. :(((
Palladin (2006-02-18 18:07:00) [10]:) ну а то что List заполняется ты не учитываешь?