[Erledigt] Dateien zählen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: [Erledigt] Dateien zählen

Beitrag von Socke »

Winni hat geschrieben:
Fr 12. Mär 2021, 14:36
Und natürlich kommt es auf die Hardware an. Mach das mal mit ner Festplatte von 1990 - falls Du noch irgenwo nen IDE Port hast. Da kannst Du Kaffee kochen gehen!
Alte Platten habe ich noch. Aber ein IDE Port? Ich musste schon mein DVD-Laufwerk abgklemmen, da zwei SATA-Ports mit dem M.2-Port verschaltet sind :)
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: [Erledigt] Dateien zählen

Beitrag von charlytango »

Also irgendwie hat mich nun auch der Ehrgeiz gepackt und ich habe als Test ein kleinens Programm getippt in dem ihc die Versionen von @Fliegermichl und @Winnie samt der von Winnie empfohlenen Methode FindAllFilles gegenüber zu stellen.

Interessant ist dass FindAllFiles ( in der Version https://wiki.freepascal.org/FindAllFiles ) einen SIGSEV produziert - vermutlich sehe ich da den Wald vor lauter Bäumen nicht.

Zudem bin ich überrascht dass beide andere Methoden eine andere Filezahl liefern -- grübel....

***********
Zum Testproggi:
Mit DirectoryEdit das Verzeichnis auswählen;
Mit dem Spinedit die Anzahl der Suchläufe einstellen;
Buttons links starten die einzelnen Suchmethoden in der Anzahl des SpinEdit.

Letzter Button links unten startet alle drei Methoden hintereinander. (die dritte ist im Moment auskommentiert weils kracht)

Vielleicht habt ihr Lust mal drauf zu sehen
Dateianhänge
project1.zip
angepasste Version
(126.61 KiB) 46-mal heruntergeladen
Zuletzt geändert von charlytango am Fr 12. Mär 2021, 18:59, insgesamt 2-mal geändert.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: [Erledigt] Dateien zählen

Beitrag von Winni »

charlytango hat geschrieben:
Fr 12. Mär 2021, 17:47

Vielleicht habt ihr Lust mal drauf zu sehen
Hi!

Deine und meine Routine suchen nach allen Dateien.
FindAllFiles sucht aber nur nach Sourcen:

FindAllFiles(ResultFiles, DirectoryEdit1.Text, '*.pas;*.pp;*.p;*.inc', true);

Da darf man sich nicht wundern, wenn verschieden Anzahl von Dateien rauskommt.

Zweitens crasht Dein Beispiel mit FindallFiles,
weil Du schon mal die ResultFiles freigibst, und danach verlangst,
dass er die Anzahl rausrückt.

Winni

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: [Erledigt] Dateien zählen

Beitrag von charlytango »

das hast du völlig recht.... hab es angepasst und auf "AllFilesMask" gestellt.. jetzt läuft es.

Also suchen alle drei Methoden (Methode Winnie, Methode Fliegermichl, Methode FindAllFilles) nach allen Dateien

Aber trotzdem gibt es da Unterschiede im Ergebnis
Screenshot 2021-03-12 190241.png
Screenshot 2021-03-12 190241.png (4.23 KiB) 1592 mal betrachtet
Methode Fliegermichl

Code: Alles auswählen

procedure TForm1.CountFiles(path: string; var dirs, files: integer);
var sr : TSearchRec;
     i : integer;
begin
  i := FindFirst(path + DirectorySeparator + AllFilesMask, faAnyFile, sr);
  while (i = 0) do
  begin
    if (sr.name <> '.') and (sr.Name <> '..') then
    begin
      if (sr.Attr and faDirectory <> 0) then
      begin
        inc(dirs);
        CountFiles(path + DirectorySeparator + sr.Name, dirs, files);
      end else
      begin
        inc(files);
      end;
    end;
    i := FindNext(sr);
  end;
  FindClose(sr);
end; 
Methode Winni

Code: Alles auswählen

function TForm1.TreeCount(StartDir: String): integer;
var search : TSearchRec;
    DirAttr : integer;
begin
  {$IFDEF LINUX} DirAttr := 48;
  {$ELSE} DirAttr := faDirectory;
  {$ENDIF}
  result := 0;
  if startDir[length(startDir)] <> DirectorySeparator then
     startDir := startDir + DirectorySeparator;

  if findFirst(startDir + AllFilesMask, faAnyFile, search) = 0 then
    begin
    repeat
      if (search.name = '.') or (search.name = '..') then Continue;
      if (search.Attr = DirAttr) then result := result + TreeCount(startDir+search.Name) else
           inc (result);
    until FindNext(search) <> 0;
    end;
  findClose(search);
end;
Methode FindAllFiles

Code: Alles auswählen

procedure TForm1.runFindAllFiles;
var
  ResultFiles: TStringList;
  StartTime, EndTime : QWord;
  row:integer;
begin
  ResultFiles := TStringList.Create;
  try
    StartTime := GetTickCount64;
    FindAllFiles(ResultFiles, DirectoryEdit1.Text, AllFilesMask, true);
    EndTime := GetTickCount64;

    row := StringGrid1.RowCount;
    StringGrid1.RowCount := row + 1;
    StringGrid1.Cells[0,row]:='FindAllFiles';
    StringGrid1.Cells[1,row]:=inttostr(ResultFiles.Count);
    //StringGrid1.Cells[2,row]:=inttostr(dirs);
    StringGrid1.Cells[3,row]:=IntToStr (EndTime-StartTime);

  finally
    ResultFiles.Free;
  end;

end; 
Aus meiner Sicht sollten doch alle drei Methode exakt die gleiche Anzahl Files liefern, oder nicht?
Any Ideas ?

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: [Erledigt] Dateien zählen

Beitrag von Winni »

Hi!

Also:

Bei meiner älteren Version haben Deine und meine Routine die gleichen Ergebnisse und ähnliche Laufzeiten.

Warum findAllFiles machmal das gleiche Ergebnis liefert und manchmal nicht, ist mir derzeit noch ein Rätsel.

Ich weiss auch nicht ob ich das lösen will:
findAllFiles laüft im Schnitt 2.5 mal langsam er als Deine oder meine Routine.

Da ist de Entscheidung doch gefallen.

Salute
Winni

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [Erledigt] Dateien zählen

Beitrag von fliegermichl »

Ich bin unter Windows 10 64 Bit. Evtl. liefert Linux etwas anderes (Symlinks?)

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [Erledigt] Dateien zählen

Beitrag von fliegermichl »

Ich hab's mal nachvollzogen.

Winnis Methode vergleicht

Code: Alles auswählen

if (search.Attr = DirAttr) then result := result + TreeCount(startDir+search.Name) else
           inc (result);
Unter Windows ist faDirectory = 16. Er findet ein .git Verzeichnis wo search.Attr = 18 ist. D.h. das Verzeichnisflag ist gesetzt und zusätzlich noch das Flag faHidden.
Deswegen zählt er das als File und übergeht aber dadurch das gesamte Verzeichnis.

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: [Erledigt] Dateien zählen

Beitrag von theo »

charlytango hat geschrieben:
Fr 12. Mär 2021, 19:11
Aber trotzdem gibt es da Unterschiede im ErgebnisScreenshot 2021-03-12 190241.png
Aber immerhin kann man sagen, dass keine der getesteten Methoden signifikant schneller ist, als die anderen?

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: [Erledigt] Dateien zählen

Beitrag von charlytango »

theo hat geschrieben:
Sa 13. Mär 2021, 10:11
Aber immerhin kann man sagen, dass keine der getesteten Methoden signifikant schneller ist, als die anderen?
Aus meiner Sicht nicht wirklich, denn solange alle drei Methoden unterschiedliche Zähl-Ergebnisse liefern ist die Zeit nur im Verhältnis zu Dateizahl zu vergleichen.

Mich wundert dass die Drei Methoden unterschiedliche Zahlen der Zählung liefern und die wiederum manchmal (nicht immer) auch noch unterschiedlich zur Zählung der "Eigenschaften" des Explorers (Win 10 64bit) sind.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [Erledigt] Dateien zählen

Beitrag von fliegermichl »

Bei mir zählt der Explorer genausoviele Ordner und Dateien wie meine Version.
Weshalb bei Winni weniger rauskommen, hatte ich ja oben schon geschrieben.

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: [Erledigt] Dateien zählen

Beitrag von charlytango »

fliegermichl hat geschrieben:
So 14. Mär 2021, 13:16
Bei mir zählt der Explorer genausoviele Ordner und Dateien wie meine Version.
Weshalb bei Winni weniger rauskommen, hatte ich ja oben schon geschrieben.
danke f die Erklärung

Antworten