Entwickler-Ecke
Dateizugriff - Dateisuchsystem beschleunigen
lambruco - Fr 13.06.03 12:07
Titel: Dateisuchsystem beschleunigen
Moin Forum,
ich habe ein Tool geschrieben, um Dateien nach Datum und Uhrzeit zu
sortieren. Diese werden dann in ein StringGrid aufgelistet.
Läuft eigentlich recht gut, ist aber recht langsam. Als Newbie gehe ich
einfach mal davon aus, das es an folgender Procedure liegt.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
| Procedure TDataModule3.FindFiles (Path, FindMask: String;ResultPath, ResultDateTime,ResultFiles: tStrings); Var FindRec: tSearchRec; Begin
If (Path = '') or (FindMask = '') or Not Assigned (ResultPath) Then Exit; If Path[Length (Path)] <> '\' Then Path := Path + '\'; If FindFirst (Path + FindMask, faAnyFile, FindRec) = 0 Then Repeat If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then begin if not DirectoryExists(path+findrec.Name) then begin ResultPath.Add (Path); if fileage(path+findrec.Name) <> -1 then begin ResultDateTime.add(DateTimeToStr( FileDateToDateTime( fileage(path+findrec.Name)))); end; ResultFiles.add (FindRec.Name); end; end; Until FindNext (FindRec) <> 0;
FindClose (FindRec);
If FindFirst (Path + '*.*', faAnyFile, FindRec) = 0 Then Repeat If (FindRec.Name <> '.') and (FindRec.Name <> '..') Then If Boolean (FindRec.Attr and faDirectory) Then FindFiles (Path + FindRec.Name, FindMask,ResultPath, ResultDateTime,ResultFiles); Until FindNext (FindRec) <> 0;
FindClose (FindRec); End; |
Gibt es eine Möglichkeit, das durchsuchen der Verzeichnisse zu beschleunigen, oder liegt es garnicht an dieser Procedure.
Lars
Delete - Fr 13.06.03 13:33
Ich habe schon lange nichts mehr mit einem StringGrid gemacht, aber es müsste eigentlich
BeginUpdate und
EndUpdate unterstützen (wie viele andere Win-Controls auch). Damit blockierst du quasi die Bildschirmausgabe, was auch ein bisschen mehr Speed bringt. Die Betonung liegt auf "bisschen", also erwarte bitte keine Wunder. :)
Empfehlenswert ist es aber in jedem Fall, denn gerade bei sehr langwierigen Prozeduren entfällt das unschöne "Aufbauen" der Liste. Stattdessen macht es am Schluss -schwupp!- und die Liste ist voll. Falls das Grid das nicht direkt unterstützt, probier´s mal direkt mit der API
Delphi-Quelltext
1: 2: 3: 4:
| procedure BeginUpdate(const wnd: HWND; UpdateState: boolean); begin SendMessage(wnd,WM_SETREDRAW,WPARAM(not UpdateState),0); end; |
Anzuwenden wie folgt:
Delphi-Quelltext
1: 2: 3: 4: 5:
| BeginUpdate(StringGrid1.Handle,TRUE);
BeginUpdate(StringGrid1.Handle,FALSE); |
Ob´s was bringt, kann ich dir aber nicht garantieren.
Zu deiner
FindFirst-Sache - Ich habe die Erfahrung gemacht, dass nur der allererste Durchlauf u.U. sehr lange dauert. Ich habe mal mit einer ähnlichen Funktion alle Ordner meiner C-Partition scannen lassen. Das dauerte beim ersten Mal auch recht lange. Aber schon der zweite Durchlauf beanspruchte nur noch einen Bruchteil der Zeit. Warum auch immer. :?
lambruco - Fr 13.06.03 14:29
Erstmal Danke,
Stringgrid verfügt leider nicht über BeginUpdate/EndUpdate und ich
habe Probleme mit der Windows API. Habe damit noch nie gearbeitet und
der Debugger meldet nur unidentifier WM_SETREDRAW .
Etwas Hilfe wäre nett
LArs
lambruco - Fr 13.06.03 14:50
:D :D :D
Hab was ähnliches gefunden
Delphi-Quelltext
1:
| stringgrid1.Perform(WM_SETREDRAW, 0, 0 ); |
bzw.
Delphi-Quelltext
1:
| stringgrid1.Perform(WM_SETREDRAW, 1, 0 ); |
läuft aber nicht wesentlich schneller.
Vermutlich ist mein Sortieralgorhythmus einfach nur schlecht, aber
für kleine Verzeichnisse reicht es.
mfg
Lars
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!