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
[Erledigt] Dateien zählen
-
- 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
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- 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
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
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) 56-mal heruntergeladen
Zuletzt geändert von charlytango am Fr 12. Mär 2021, 18:59, insgesamt 2-mal geändert.
- 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
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
-
- 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
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 Methode Fliegermichl
Methode Winni
Methode FindAllFiles
Aus meiner Sicht sollten doch alle drei Methode exakt die gleiche Anzahl Files liefern, oder nicht?
Any Ideas ?
Also suchen alle drei Methoden (Methode Winnie, Methode Fliegermichl, Methode FindAllFilles) nach allen Dateien
Aber trotzdem gibt es da Unterschiede im Ergebnis 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;
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;
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;
Any Ideas ?
- 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
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
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
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1435
- 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
Ich bin unter Windows 10 64 Bit. Evtl. liefert Linux etwas anderes (Symlinks?)
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1435
- 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
Ich hab's mal nachvollzogen.
Winnis Methode vergleicht
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.
Winnis Methode vergleicht
Code: Alles auswählen
if (search.Attr = DirAttr) then result := result + TreeCount(startDir+search.Name) else
inc (result);
Deswegen zählt er das als File und übergeht aber dadurch das gesamte Verzeichnis.
Re: [Erledigt] Dateien zählen
Aber immerhin kann man sagen, dass keine der getesteten Methoden signifikant schneller ist, als die anderen?charlytango hat geschrieben: ↑Fr 12. Mär 2021, 19:11Aber trotzdem gibt es da Unterschiede im ErgebnisScreenshot 2021-03-12 190241.png
-
- 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
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.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1435
- 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
Bei mir zählt der Explorer genausoviele Ordner und Dateien wie meine Version.
Weshalb bei Winni weniger rauskommen, hatte ich ja oben schon geschrieben.
Weshalb bei Winni weniger rauskommen, hatte ich ja oben schon geschrieben.
-
- 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
danke f die Erklärungfliegermichl hat geschrieben: ↑So 14. Mär 2021, 13:16Bei mir zählt der Explorer genausoviele Ordner und Dateien wie meine Version.
Weshalb bei Winni weniger rauskommen, hatte ich ja oben schon geschrieben.