Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi FindNext Reihenfolge (https://www.delphipraxis.net/52130-findnext-reihenfolge.html)

Patrick 24. Aug 2005 09:45


FindNext Reihenfolge
 
Hallo,

Ich möchte zwei Ordner vergleichen. Dazu verwende ich FindNext (und was so dazugehört). Allerdings gibt FindNext den Inhalt der zwei Ordner in unterschiedlicher Reihenfolge aus, was dazu führt, dass mein optimierter Algorithmus nicht funktioniert.

Kann ich das ändern? Und nach welcher Gesetzmäßigkeit liest FindNext die Dateien?

Wenn ich ein und den selben Ordner mit einander vergleiche hat er die gleiche Reihenfolge, was auch logisch ist, da es ja der selbe Ordner ist. Jetzt nehme ich aber einen anderen Ordner, mit dem selben Inhalt: Hier hat der Inhalt aber eine andere Reihenfolge... Warum?

Olli 24. Aug 2005 09:54

Re: FindNext Reihenfolge
 
Auch wenn man wohl annehmen kann, daß FindNext nach den Namen geht, so ist die keineswegs festgelegt. FindNext ist übrigens ein Wrapper für die API-Funktion MSDN-Library durchsuchenFindNextFile() womit dies hier eindeutig eine API-Frage ist.

Du kannst also die o.g. Annahme machen, solltest dir aber im Klaren sein, daß Windows auch irgendwann mal die Dateien nach Datum, Mondphase, Sternzeichen oder File-ID zurückgeben könnte.

Muetze1 24. Aug 2005 09:57

Re: FindNext Reihenfolge
 
Seit CP/M und DOS Zeiten werden die Einträge in der Reihenfolge zurück geliefert, wie sie in der Zuordnungstabelle gefunden werden - und das ist meist quer durcheinander. Norton SpeedDisk hatte damals z.B. die Einträge für die einzelnen Ordner alphabetisch sortiert in den Zuordnungstabellen, damit das Betriebssystem nicht mehr so lange sortieren musste beim anzeigen.

RavenIV 24. Aug 2005 10:02

Re: FindNext Reihenfolge
 
Zitat:

Zitat von Olli
Auch wenn man wohl annehmen kann, daß FindNext nach den Namen geht, so ist die keineswegs festgelegt. FindNext ist übrigens ein Wrapper für die API-Funktion MSDN-Library durchsuchenFindNextFile() womit dies hier eindeutig eine API-Frage ist.

Du kannst also die o.g. Annahme machen, solltest dir aber im Klaren sein, daß Windows auch irgendwann mal die Dateien nach Datum, Mondphase, Sternzeichen oder File-ID zurückgeben könnte.

aus der MSDN:
Zitat:

The order in which this function returns the file names is dependent on the file system type. With the NTFS file system and CDFS file systems, the names are returned in alphabetical order. With FAT file systems, the names are returned in the order the files were written to the disk, which may or may not be in alphabetical order.
falls du also nicht NTFS hast, bekommst du die files in der reihenfolge, wie sie auf der platte erstellt wurden.

Olli 24. Aug 2005 10:17

Re: FindNext Reihenfolge
 
Zitat:

Zitat von RavenIV
falls du also nicht NTFS hast, bekommst du die files in der reihenfolge, wie sie auf der platte erstellt wurden.

Was sich aber vermutlich am (durchaus änderbaren) Dateidatum festmachen wird :zwinker: ...

DP-Maintenance 24. Aug 2005 10:53

DP-Maintenance
 
Dieses Thema wurde von "Daniel" von "Object-Pascal / Delphi-Language" nach "Windows API / MS.NET Framework API" verschoben.

SirThornberry 24. Aug 2005 11:15

Re: FindNext Reihenfolge
 
was hindert einen daran das Ergebnis von FindFirst etc. in eine Stringlist zu packen, diese zu sortieren und dann zu vergleichen?

Christian Seehase 24. Aug 2005 15:45

Re: FindNext Reihenfolge
 
Moin Patrick,

ich kenne jetzt Deinen Algorithmus nicht, und weiss natürlich auch nicht die Kriterien des Vergleiches, aber warum nimmst Du nicht das Ergebnis aus Verzeichnis 1 und versuchst diese Datei bzw. dieses Verzeichnis in Verzeichnis 2 zu finden, um es mal vereinfacht auszudrücken.
Entweder es ist da oder nicht.
In ersterem Falle kannst Du dann noch nach weiteren Kriterien vergleichen.
So bist Du völlig unabhängig von der Reihenfolge.

Patrick 25. Aug 2005 08:40

Re: FindNext Reihenfolge
 
Zitat:

The order in which this function returns the file names is dependent on the file system type. With the NTFS file system and CDFS file systems, the names are returned in alphabetical order. With FAT file systems, the names are returned in the order the files were written to the disk, which may or may not be in alphabetical order.
So machen meine Beobachtungen Sinn, aber das ist garichtmal schlimm. Dann funktioniert mein System halt nur auf NTFS...(also das Gelbe vom Ei ist das ja nicht...)


@SirThornberry
So habe ich es bei meinem alten Algorithmus gemacht, allerdings ist der langsam und bei weitem nicht so hübsch, wie der neue.

@Christian Seehase
Also mein Algorithmus gleicht zwei Ordner so ab, dass er mir nacher sagt, wo welche Datei zu viel ist bzw. welche wo neuer ist. Mit diesen Informationen kann ich z.B. ein Backup meiner Eigenen Dateien machen, ohne jedesmal alles auf eine Backup-Festplatte kopieren zu müssen. Somit kopiere ich nur noch Dateien, die vom Änderungs-Datum her neuer sind, oder Dateien, die neu dazu gekommen sind.

Olli 25. Aug 2005 08:50

Re: FindNext Reihenfolge
 
Und wes Grundes denkst du, sei es ineffektiv es so zu machen wie andere oben vorschlugen (besonders gefällt mir Christians Idee dabei)? Weißt du eigentlich wieviel das OS macht, während es "nichts" macht? Glaube mir, da ist das Auflisten mehrerer Dateien einfach lächerlich dagegen.

Patrick 25. Aug 2005 09:55

Re: FindNext Reihenfolge
 
Also das auflisten von ein paar Ordnern ist dabei ja auch nicht das langsame. Die Ordner zu sortieren und mit einander zu vergleichen dauert (verhältnismäßig) lange.

Die Idee vom Christian kommt für mich nicht in Frage, da ich zweimal vergleichen müsste:

Ordner1:
toll.txt
seppel.dat

Ordner2:
Haus.doc
seppel.dat

Die Frage, die es zu beantworten gilt: Ist das, was in Ordner1 ist, auch in Ordner2?
Ich checke also, ob die Datei toll.txt in Ordner 2 vorhanden ist: nein. Seppel.dat ist vorhanden. Jetzt weis ich aber noch nicht, dass in Ordner 2 eine Datei mit Namen Haus.doc liegt. Um das herauszufinden müsste ich nochmal andersherum fragen: Ist das, was in Ordner2 ist, auch in Ordner1?

Olli 25. Aug 2005 10:01

Re: FindNext Reihenfolge
 
Zitat:

Zitat von Patrick
Die Idee vom Christian kommt für mich nicht in Frage, da ich zweimal vergleichen müsste:

... wie machen das nur die ganzen Programme ala WinMerge? :gruebel:

Zitat:

Zitat von Patrick
Die Frage, die es zu beantworten gilt: Ist das, was in Ordner1 ist, auch in Ordner2?
Ich checke also, ob die Datei toll.txt in Ordner 2 vorhanden ist: nein. Seppel.dat ist vorhanden. Jetzt weis ich aber noch nicht, dass in Ordner 2 eine Datei mit Namen Haus.doc liegt. Um das herauszufinden müsste ich nochmal andersherum fragen: Ist das, was in Ordner2 ist, auch in Ordner1?

Hashlisten sind die Antwort. Dazu sollte es hier im Forum auch was geben. Zugegeben ist dies unter PHP oder Perl leichter, aber auch mit Delphi geht es AFAIK.

SirThornberry 25. Aug 2005 11:44

Re: FindNext Reihenfolge
 
in der unit "inifiles" gibt es dafür schon die Klasse "THashedStringList"


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:58 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