Opróżnianie pamięci po wykonaniu zadania

0

Witam,

napisałem prostą wyszukiwarkę plików w Delphi. Zrozumiałe jest, że podczas wyszukiwania plików potrzebuje sporej pamięci do tego celu. Jednak jak, po wyszukaniu plików, wyczyścić tę pamięć? Pytam ponieważ w managerze procesów program po zakończeniu wyszukiwania plików wciąż pożera sporo pamięci RAM. Pozdrawiam!

2

No ale przecież nie mamy bladego pojęcia, jak to napisałeś.
I nie, nie jest zrozumiałe, że Twój program potrzebuje sporo pamięci podczas wyszukiwania plików.

0

OK a więc oto kod przycisku Button1 odpowiedzialnego za wyszukiwanie plików:

procedure Tglowna.Button1Click(Sender: TObject);
var
  Lista: TStringList;
  i: integer;
begin
  try
    Lista := TStringList.Create;
       RS.ZnajdzPlik('c:\', '*.pdf', Lista);
       for i := 1 to lista.Count-1 do
       begin
          memo.Lines.Add(lista.Strings[i]);
       end;
    Lista.Free;
  except

  end;

end; 

Używam modułu "reiko" w którym mam tę procedurę a ma ona taką oto definicję:

 procedure TRS.ZnajdzPlik(Sciezka,NazwaPliku:String; wyniki: TStringList);
var
  FSearchRec,DSearchRec:TSearchRec;
  FindResult:integer;

  function GetDirectoryName(Dir:String):String;
  begin
   if Dir[Length(Dir)]<>'\' then
   Result:=dir+'\'
    else
   Result:=Dir;
  end;

  function IsDirNotation(AdirName:String):Boolean;
  begin
   Result:=(AdirName='.') or (AdirName='..');
  end;

{
faReadOnly - Tylko do odczytu
faHidden - Ukryty
faSysVolume - Plik systemowy
faVolumeID - Etykieta woluminu
faDirectory - Katalog
faArchive - Zarchiwizowany
faAnyFile - Dowolny plik
}
begin
//FindResult:=FindFirst(Sciezka+NazwaPliku,faReadOnly+faHidden+faArchive+faAnyFile,FSearchRec);
  Sciezka:=GetDirectoryName(Sciezka);
  FindResult:=FindFirst(Sciezka+NazwaPliku,faAnyFile+faHidden+faSysFile+faReadOnly,FSearchRec);
  try
  while FindResult = 0 do
  begin
  { if info = true  then Wyniki.Add(Sciezka+FsearchRec.Name+ ': ' + FloatToStr(rozmiarpliku(Sciezka+FsearchRec.Name)/1024) + ' KB');
    if info = false then }
    Wyniki.Add(Sciezka+FsearchRec.Name);

    FindResult:=FindNext(FSearchRec);
  end;

  FindResult:=FindFirst(Sciezka+'*.*',faDirectory,DSearchRec);
  while FindResult=0 do
  begin
   if ((DSearchRec.Attr and faDirectory)=faDirectory) and not IsDirNOtation(DSearchRec.Name) then
   ZnajdzPlik(Sciezka+DSearchRec.Name,NazwaPliku, wyniki);
   FindResult:=FindNext(DSearchRec);
  end;
  finally
  FindClose(FSearchRec);
 end;
end;
1
  1. jak już to całe Button1Click można zapisać tak RS.ZnajdzPlik('c:\', '*.pdf', memo.Lines);
  2. pamięć mimo iż jest już nieużywana przez program nie jest od razu "odbierana" przez system. Dopóki system tej pamięci nie będzie potrzebował to będzie ona wisiała jako zajęta przez program.

BTW ile to jest sporo pamięci i ile tych plików znajduje?

GetDirectoryName już jest i się nazywa IncludeTrailingPathDelimiter w moule SysUtils

0

Jejku, gdzie ty widziałeś tak formatowany kod. Gdybyś się trochę przyłożył, sam byś zauważył, że brakuje jednego FindClose. Są dwa FindFirst a jedno FindClose. Formatowanie kodu naprawdę ułatwia życie :-).

A jeszcze drugie. Leń żeś. W helpie piszą, jak się sprawdza błędy. A Ty zamiatasz pod dywan:

try
  { mój wspaniały kod }
except
  { no cicho, cicho -  nic się nie stało}
end;
1

Przy wyszukiwaniu plików funkcjami FindFirst i FindNext to akurat polecam poniższą konstrukcję:

var
  srFile: TSearchResult;

{..}

if FindFirst(strPath + '*.*', faAnyFile, srFile) = 0 then
try
  repeat
    // użycie nazw plików
  until FindNext(srFile) <> 0;
finally
  FindClose(srFile);
end;

Po pierwsze ograniczy się używanie pomocniczych zmiennych, po drugie kod będzie czytelniejszy, po trzecie - bez względu na to, czy kod zostanie przerwany (np. wyjątkiem wewnątrz pętli) czy nie, FindClose zawsze zostanie wywołany; No i nie ma możliwości zgubienia wywołania tej procedury, ani zapisania jej więcej niż raz, bo się łatwo zauważy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1