Hab ein Programm geschrieben, welches nach einer ganze Liste von Dateinamen suchen kann. Wenn ich ein Duzend Dateinamen eingebe, läuft alles reibungslos. Gebe ich aber ein paar hundert Dateinamen ein, stürzt das Programm ab. Vielleicht läuft der Speicher über!?
Hier der Auszug um die Suchprozedur:
Delphi-Quellcode:
procedure GetAllFiles (Mask_: String; Items_: TStrings);
const
FileAttr = faReadOnly+faHidden+faArchive;
var
Search: TSearchRec;
SFName: String;
SFPath: String;
begin
SFName := ExtractFileName(Mask_);
SFPath := ExtractFilePath(Mask_);
if SFPath[Length(SFPath)]<>'\' then SFPath := SFPath+'\';
// alle Dateien suchen
if FindFirst(Mask_, FileAttr, Search)=0 then
begin
repeat
begin
Items_.Add(SFPath+Search.Name)
end
until FindNext(Search)<>0
end;
// Unterverzeichnisse durchsuchen
if FindFirst(SFPath+'*.*',faDirectory,Search)=0 then
begin
repeat
begin
if ((Search.Attr and faDirectory)=faDirectory)
and (Search.name[1]<>'.') then
begin
// Selbstaufruf von GetAllFiles
GetAllFiles(SFPath+Search.Name+'\'+SFName,Items_)
end
end
until FindNext(Search)<>0
end;
FindClose(Search);
end;
procedure TForm1.btnSuchenClick(Sender: TObject);
var
Suchobjekt: String;
i, i0: Integer;
test: tmsgdlgbtn;
begin
If Edit1.Text = 'Zu durchsuchendes Verzeichnis' then
begin
OrdnerauswahlClick;
end else
If Memo1.Lines[0] = 'Bitte geben Sie das/die zu suchende(n) Objekt(e) ein!' then
begin
Showmessage('Bitte geben Sie das/die zu suchende(n) Objekt(e) ein!');
end
else
begin
screen.Cursor := crHourglass;
For i := 0 to Memo1.Lines.Count-1 do
begin
Suchobjekt := Memo1.Lines[i];
If not CheckBox1.Checked then
begin
Suchobjekt := '*' + Suchobjekt + '*';
end;
GetAllFiles (Edit1.Text + '\' + Suchobjekt, clbSuchergebnisse.Items);
end;
If clbSuchergebnisse.Items.Count = 0 then
StatusBar1.Panels[0].Text := 'Es wurden keine Objekte gefunden.';
If clbSuchergebnisse.Items.Count = 1 then
StatusBar1.Panels[0].Text := 'Es wurde 1 Objekt gefunden.';
If clbSuchergebnisse.Items.Count > 1 then
StatusBar1.Panels[0].Text := 'Es wurden ' + IntToStr(clbSuchergebnisse.Items.Count)
+ ' Objekte gefunden.';
For i := Memo1.Lines.Count+1 downto 1 do
begin
For i0 := 1 to clbSuchergebnisse.Count do
begin
If Memo1.Lines[i-1] = ExtractFileName(clbSuchergebnisse.Items[i0-1]) then
begin
Memo1.Lines.Delete(i-1);
end;
end;
end;
screen.Cursor := crDefault;
end;
end;
Kann mir jemand helfen?