Entwickler-Ecke

Open Source Projekte - Dateien-Suchprogramm


Wolle92 - Sa 16.06.07 17:33
Titel: Dateien-Suchprogramm
Also ich habe vor allem festgestellt, dass es schneller ist, als die Windows-Suche

Aktuelle Version: 1.1

Veränderungen in Version 1.1
[NEU]Grenze für maximal 4 Zeichen bei der Dateiendung aufgehoben
[NEU]Suche nach einem Teil eines Dateinamens kann jetzt auch nur nach bestimmten Endungen suchen
[NEU]Den Rest habe ich vergessen...
-------------------------------------------------


hui1991 - Sa 16.06.07 18:27

Hi,

Dateiendung auf 4 Begrenzen ist schwachsinn!
Denk mal an tar.gz dateien oder zip oder rar oder exe oder mp3, alle weniger als 4 und dann verlang das 4 Zeichen.

Aktuelles Verzeichnis:
C:\\Dokumente und EInstellungen\...
Mich wundert es überhaupt das er die unterverzeichnisse findet.

naja okay denke nicht das es schneller ist ^^
Sonst ein Funktionsfähiges Programm.

MfG
hui1991


Lannes - Sa 16.06.07 19:18

Hallo,
user profile iconWolle92 hat folgendes geschrieben:
Also ich habe vor allem festgestellt, dass es schneller ist, als die Windows-Suche

wer hat zuerst gesucht, Windows oder Dein Programm? :wink:

Wenn Du BeginUpdate und EndUpdate benutzt wird es schneller. Außerdem ist case auch besser als 3 If-Abfragen, ist aber für die Geschwindigkeit hier unerheblich.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  { Such-Routine auswählen }
  ListView.Items.BeginUpdate;
  case ComboBox.ItemIndex of
    0   : SucheDir1(Edit1.Text, ShellTreeView1.Path);
    1   : SucheDir2(Edit1.Text, ShellTreeView1.Path);
    2   : SucheDir3(Edit1.Text, ShellTreeView1.Path);
      end;
  ListView.Items.EndUpdate;


Die Überprüfung der Extension wird in der rekursiven Such-Prozedur immer wieder vorgenommen, das ist doch nicht erforderlich, sie ändert sich doch nicht.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.SucheDir3(ext: Str4; pfad: String);
var sr: TSearchRec;
    r: Integer;
    liNew: TListItem;
begin
  { Punkt anfügen, falls nicht vorhanden }
  if Pos('.', ext) = 0 then
    ext := '.' + ext;
  { Funktions-Beginn }
  ext := UpperCase(ext);
 //...
        SucheDir3(ext, pfad + '\' + sr.name)


Wolle92 - So 17.06.07 07:19

1. Es gibt aber auch Endungen mit 4 Zeichen: html, java...
2. Die Unterordner werden gefunden, weil sobald in den Attributen steht, das das ganze ein Ordner ist, da hinein gegangen wird und da weitergesucht wird, wenn der Ordner durhc ist gehts wieder zurück.
3. Wie sollte ich das Programm denn sonst weitersuchen lassen?
4. Die Feststellung, dass es schneller ist, als die XP-Suche habe ich von einem Freund, der sofort meinte, das meins ja viel schneller ist. Also es geht um die XP-Suche, die Vista-Suche ist schon schneller


Wolle92 - Mo 18.06.07 07:04

Update: Version 1.1

Veränderungen:
[NEU]Grenze für maximal 4 Zeichen bei der Dateiendung aufgehoben
[NEU]Suche nach einem Teil eines Dateinamens kann jetzt auch nur nach bestimmten Endungen suchen
[NEU]Den Rest habe ich vergessen...


Lannes - Mo 18.06.07 09:23

Hallo,

case eingebaut, gut.

Haben der Einbau von BeginUpdate und EndUpdate, sowie das herrauslösen der Überprüfung der Extension aus der rekursiven Funktion, keine Geschwindigkeitsvorteile gebracht?
Oder hat es einen anderen Grund meine Vorschläge nicht in Betracht zu ziehen? :gruebel:


ZeitGeist87 - Mo 18.06.07 09:40

sobald ich mit der windowssuche einmal gesucht hab, ist die beim 2. mal auch schneller, weil alles im gecached ist...

ich bleib bei der windowssuche :)


Wolle92 - Mo 18.06.07 10:25

das kommt bei mir auch noch rein...
Ist ja erst Version 1.1

@Lannes: Ich habs einfach nicht verstanden, wie du das machen willst... Schick mal Quellcode-Ausschnitt, wie du das machen würdest


ZeitGeist87 - Mo 18.06.07 10:29

user profile iconWolle92 hat folgendes geschrieben:
das kommt bei mir auch noch rein...
Ist ja erst Version 1.1

@Lannes: Ich habs einfach nicht verstanden, wie du das machen willst... Schick mal Quellcode-Ausschnitt, wie du das machen würdest


das is irrelevant, ob das bei dir reinkommt oder nicht :)
das passiert automatisch!

egal ob windowssuche oder dein programm


Wolle92 - Mo 18.06.07 10:33

Achso... dann kommt bei mir wenigstens noch... irgendwas anderes rein, was die Suche schneller machen kann, nen bleibender Index oder so...


Lannes - Mo 18.06.07 23:08

Hallo,

user profile iconWolle92 hat folgendes geschrieben:
@Lannes: Ich habs einfach nicht verstanden, wie du das machen willst... Schick mal Quellcode-Ausschnitt, wie du das machen würdest
hab ich schon, :schmoll: etwas genauer hinschauen :mahn: :wink:

user profile iconLannes hat folgendes geschrieben:
Wenn Du BeginUpdate und EndUpdate benutzt wird es schneller. ...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  { Such-Routine auswählen }
  ListView.Items.BeginUpdate;
  case ComboBox.ItemIndex of
    0   : SucheDir1(Edit1.Text, ShellTreeView1.Path);
    1   : SucheDir2(Edit1.Text, ShellTreeView1.Path);
    2   : SucheDir3(Edit1.Text, ShellTreeView1.Path);
      end;
  ListView.Items.EndUpdate;

Dadurch verhindert man das bei jedem hinzugefügten Item das ListView neu gezeichnet wird.

Zum Thema Überprüfung der Extension:
Die gehighlighten Zeilen lagerst Du in eine Hilffunktion aus.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.SucheDir3(ext: Str4; pfad: String);
var sr: TSearchRec;
    r: Integer;
    liNew: TListItem;
begin
  { Punkt anfügen, falls nicht vorhanden }
  if Pos('.', ext) = 0 then
    ext := '.' + ext;
  
  { Funktions-Beginn }//<----------- eine Funktion fängt bei begin an
  ext := UpperCase(ext);
 //...
        SucheDir3(ext, pfad + '\' + sr.name)

Das sieht dann im groben so aus

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function HilfsFunc(ext: String): String;
begin
  // der Code
end;

//der Aufruf
//die Funktion HilfsFunc übergibt seinen Rückgabewert an die Prozedur SucheDir3
SucheDir3(HilfsFunc(Edit1.Text), ShellTreeView1.Path);

So wird die Extension nur einmal beim Aufruf überprüft und nicht bei jeder Rekursion.

//Edit: Ohne Dich jetzt entmutigen zu wollen, wenn Du Dich näher mit dem Thema Dateisuche beschäftigen willst, kann ich Dir das Thema von user profile iconHeiko empfehlen:
[Delphi, Win32] SearchTool - schnelles Suchverfahren [http://www.delphi-forum.de/viewtopic.php?t=48936]


Wolle92 - Di 19.06.07 15:33

Aha... :idea: :idea: :idea: :idea: :idea: :idea: :idea: :idea: :idea: :idea:
Jetzt hab ich verstanden, was du meintest...


Wolle92 - Di 19.06.07 16:13

Aber es ist besser, wenn man es ohne BeginUpdate oder EndUpdate macht, weil so muss der User warten, bis die Suche beendet wurde, wenn man es ohne macht, kann man schon während der Suche Dateien öffnen und Abbrechen