AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

TSearchRec.Findfirst, findnext Alternative

Ein Thema von Bjoerk · begonnen am 12. Sep 2011 · letzter Beitrag vom 13. Sep 2011
Antwort Antwort
Seite 1 von 2  1 2   
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

TSearchRec.Findfirst, findnext Alternative

  Alt 12. Sep 2011, 17:41
Delphi-Version: 2007
Kennt jemand eine schnellere TSearchRec.Findfirst, findnext Alternative ?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.612 Beiträge
 
Delphi 12 Athens
 
#2

AW: TSearchRec.Findfirst, findnext Alternative

  Alt 12. Sep 2011, 18:01
Du kannst das auch per API machen (MSDN-Library durchsuchenFindFirstFile, MSDN-Library durchsuchenFindNextFile), aber ob das schneller ist, weiß ich nicht.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TSearchRec.Findfirst, findnext Alternative

  Alt 12. Sep 2011, 18:30
Is the same.

Delphi-Quellcode:
function FindMatchingFile(var F: TSearchRec): Integer;
var
  LocalFileTime: TFileTime;
begin
  with F do
  begin
    while FindData.dwFileAttributes and ExcludeAttr <> 0 do
      if not FindNextFile(FindHandle, FindData) then
      begin
        Result := GetLastError;
        Exit;
      end;
    FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
    FileTimeToDosDateTime(LocalFileTime, LongRec(Time).Hi,
      LongRec(Time).Lo);
    Size := FindData.nFileSizeLow or Int64(FindData.nFileSizeHigh) shl 32;
    Attr := FindData.dwFileAttributes;
    Name := FindData.cFileName;
  end;
  Result := 0;
end;

function FindFirst(const Path: string; Attr: Integer;
  var F: TSearchRec): Integer;
const
  faSpecial = faHidden or faSysFile or faDirectory;
begin
  F.ExcludeAttr := not Attr and faSpecial;
  F.FindHandle := FindFirstFile(PChar(Path), F.FindData);
  if F.FindHandle <> INVALID_HANDLE_VALUE then
  begin
    Result := FindMatchingFile(F);
    if Result <> 0 then FindClose(F);
  end else
    Result := GetLastError;
end;

function FindNext(var F: TSearchRec): Integer;
begin
  if FindNextFile(F.FindHandle, F.FindData) then
    Result := FindMatchingFile(F) else
    Result := GetLastError;
end;

procedure FindClose(var F: TSearchRec);
begin
  if F.FindHandle <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(F.FindHandle);
    F.FindHandle := INVALID_HANDLE_VALUE;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.923 Beiträge
 
Delphi 12 Athens
 
#4

AW: TSearchRec.Findfirst, findnext Alternative

  Alt 12. Sep 2011, 18:50
Schneller geht nur

- die MFT auslesen (bei NTFS)

- mit Backuprechten das Verzeichnis direkt auslesen und den Inhalt selber parsen
(hier brauchst'e dann Wissen über die Interna von ausreichend verschiedenen Dateisystemen)


schneller, aber einfacher = Austausch der HDD (SDD)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: TSearchRec.Findfirst, findnext Alternative

  Alt 12. Sep 2011, 20:59
Wie machen es denn die ShellCtrls ?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.923 Beiträge
 
Delphi 12 Athens
 
#6

AW: TSearchRec.Findfirst, findnext Alternative

  Alt 12. Sep 2011, 21:26
Wie machen es denn die ShellCtrls ?
Schau doch nach?

Die gehn über MSDN-Library durchsuchenSHGetDesktopFolder und Co.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: TSearchRec.Findfirst, findnext Alternative

  Alt 13. Sep 2011, 08:08
Ich hab' mir die ShellCtrls jetzt auch mal näher angesehen. Die laden immer nur den nächsten Level in das TreeView rein (keine Rekursion). Deshalb sind diese (scheinbar) schneller, liegt weniger an findfirst und Co.. ShellTreeView1.Items[0].Expand(true) dauert deshalb auch sehr lange (lädt dann die fehlenden Items nach).
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.612 Beiträge
 
Delphi 12 Athens
 
#8

AW: TSearchRec.Findfirst, findnext Alternative

  Alt 13. Sep 2011, 08:21
Das macht übrigens der Windows Explorer auch nicht anders.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: TSearchRec.Findfirst, findnext Alternative

  Alt 13. Sep 2011, 10:30
So geht's eigentlich ganz gut, nur bisschen doof, daß dann erst mal nicht angezeigt wird, ob der Ordner Unterordner hat.

Delphi-Quellcode:
procedure GetNextLevelNodeDirs(const ADirectory: String; var ATree: TTreeView; const Start: TTreeNode);
var
  S: TSearchRec;
  R: integer;
  N: TTreeNode;
begin
  R:= FindFirst(IncludeTrailingPathDelimiter(ADirectory)+'*.*', faDirectory, S);
  while R = 0 do
  begin
    if ((S.Attr and faDirectory) <> 0) then
      if ((S.Name <> '.') and (S.Name <> '..')) then
        if not N.HasChildren then
          N:= ATree.Items.AddChild(Start, S.Name);
    R:= FindNext(S);
  end;
  Findclose(S);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Path: string;
begin
  Path:= 'C:\';
  TreeView1.Items.BeginUpDate;
  GetNextLevelNodeDirs(Path, TreeView1, TreeView1.Items.AddChild(Nil, Path));
  TreeView1.Items.EndUpDate;
  TreeView1.Items[0].Expand(false);
end;

function GetTreeNodePath(const ANode: TTreeNode): string;
var
  I: integer;
begin
  if Assigned(ANode) then
    if Assigned(ANode.Parent) then
      GetTreeNodePath:= GetTreeNodePath(ANode.Parent)+'\'+ANode.Text
    else
      Result:= ANode.Text
  else
    Result:= '';
  if Result <> 'then Result:= Result+'\';
  I:= 1;
  while I < Length(Result) do
  begin
    if (Result[I] = '\') and (Result[I+1] = '\') then Delete (Result, I, 1);
    Inc(I);
  end;
end;

procedure TForm1.TreeView1Click(Sender: TObject);
var
  ANode: TTreeNode;
begin
  ANode:= TreeView1.Selected;
  TreeView1.Items.BeginUpDate;
  GetNextLevelNodeDirs(GetTreeNodePath(ANode), TreeView1, ANode);
  TreeView1.Items.EndUpDate;
end;

procedure TForm1.TreeView1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  TreeView1Click(Sender);
end;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.612 Beiträge
 
Delphi 12 Athens
 
#10

AW: TSearchRec.Findfirst, findnext Alternative

  Alt 13. Sep 2011, 10:36
Ich kenne da den Trick, zunächst einmal "Dummy"-Knoten anzulegen, damit auf jeden Fall das "+" angezeigt wird. Wird nun versucht, den Knoten aufzuklappen und der Ordner enthält keine Unterordner, dann wird das Aufklappen abgebrochen und das "+" entfernt. Aber mal etwas anderes zu GetNextLevelNodeDirs: wieso übergibst Du die Treeview als Var-Parameter? Und N ist zumindest beim ersten Scheifendurchlauf nicht initialisiert, es wundert mich ein wenig, dass das nicht knallt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz