![]() |
FindFirstFileEx
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe bereits hier und auch in einer Suchmaschine nach FindFirstFileEx gesucht. In Bezug auf Delphi aber nichts gefunden. Ich möchte in einem zeitkritischen Programm gern ausschließlich nach Verzeichnissen suchen über die API. Ich habe in SysUtils bereits gesehen, dass einfach alles gelesen und erst danach gefiltert wird. Auch mit
Delphi-Quellcode:
, welches eben in
FindFirstFile
Delphi-Quellcode:
genutzt wird, kann man nicht im Vorfeld filtern. Die Nutzer werden insoweit nur "geblendet", als sich SysUtils um das Filtern kümmert <- aber nachträglich.
SysUtils.FindFirst
So bin ich auf ![]()
Delphi-Quellcode:
kann man mitteilen, dass man nur das nötigste wissen will und über
fInfoLevelId
Delphi-Quellcode:
soll man laut
fSearchOp
![]()
Delphi-Quellcode:
die Suche beschleunigen können.
FIND_FIRST_EX_LARGE_FETCH
Nun meine Fragen: 1. In
Delphi-Quellcode:
sind nur 2 statt der 3 bei MSDN ausgewiesenen Werte deklariert.
Windows.TFindexInfoLevels
Delphi-Quellcode:
fehlt dort, was am performantesten sein soll. Kann man das einfach so (nach)deklarieren? Falls ja, wie?
FindExInfoBasic
2. Unter
Delphi-Quellcode:
gibt es zwar
Windows.TFindexSearchOps
Delphi-Quellcode:
. Das scheint aber wirkungslos zu sein. Es wird trotzdem jeder Eintrag inkl. Dateien angezeigt. Welche Dateisysteme außer NTFS gibt es denn noch? Unterstützt NTFS das nicht? Falls doch, wie bekommen ich heraus, ob die konkrete Partition mit NTFS es unterstützt?
FindExSearchLimitToDirectories
3.
Delphi-Quellcode:
ist - zumindest in der Windows.pas - nicht deklariert. Laut MSDN hat es den Wert 2. Wenn ich das nachträglich deklariere, liefert mir
FIND_FIRST_EX_LARGE_FETCH
Delphi-Quellcode:
aber "Falscher Parameter". Wo liegt hier mein Denkfehler?
GetLastError
Den Quellcode habe ich beigefügt. Gruß, Alex P.S. Bitte nicht wundern! Ich habe alles selbst deklariert, weil in TurboDelphi z.B. der Rückgabewert für FindFirstFileEx fälschlich als Bool deklariert und noch mehr Fehler drin waren. |
AW: FindFirstFileEx
(zu 1) FindExInfoBasic: Zitat MSDN ="This value is not supported until Windows Server 2008 R2 and Windows 7."
(zu 2) FindExSearchLimitToDirectories: Zitat MSDN = "If directory filtering is desired, this flag can be used on all file systems, but because it is an advisory flag and only affects file systems that support it, the application must examine the file attribute data stored in the lpFindFileData parameter of the FindFirstFileEx function to determine whether the function has returned a handle to a directory." MS schweigt sich darüber aus, welches Filesystem derzeit dieses Flag unterstützt; offensichtlich keines (MS 2005: "reserved for future use"). Nach übereinstimmenden Berichten jedenfalls "NTFS is not actually part of the operating systems supported". Also selbst alles rausfiltern, was (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)=0 hat). (zu 3) FIND_FIRST_EX_LARGE_FETCH: Zitat MSDN = "This value is not supported until Windows Server 2008 R2 and Windows 7." Setze den Wert für dwAdditionalFlags einfach auf "0", dann sollte es funktionieren. |
AW: FindFirstFileEx
Danke für die Erklärungen. Ich hatte zwar den Text bei MSDN gelesen; scheinbar zu oberflächlich. Ich hatte das nur kurz durchgesehen und mir war das fett gedruckte "Windows XP" ins Auge gefallen. Wieso drucken sie das erst fett, wenn dann im Schmaldruck das wirklich wichtige geschrieben steht?
Zumindest für
Delphi-Quellcode:
steht dort aber Minimum supported "Windows 2000 ...". Also müsste doch das klappen. Und dennoch muss ich nachträglich filtern. Wie das?
FindExSearchLimitToDirectories
Wenn ich das richtig deute, kann ich mir das also sparen, wenn mein Programm hauptsächlich auf Rechnern mit Windows XP eingesetzt werden soll. Gruß, Alex |
AW: FindFirstFileEx
Nach allem, was ich so gelesen habe, kann man diesen Wert derzeit leider vergessen. Also alles selbst filtern, ist aber egal, weil irgendjemand sowieso filtern muss und die Performance daher immer von einem Filter belastet wird.
Meine Frage im Anschluss dazu: Wenn ich in einem Verzeichnis nach '*.dpr' suche, dann werden zwei Dateien gefunden: -) meinprojekt.dpr und -) meinprojekt.dproj Danach habe ich aber nicht gesucht. Die .dproj-Datei sollte nicht geliefert werden. Weiss jemand, wie man die korrekte Antwort erzwingen kann? |
AW: FindFirstFileEx
Zitat:
Wenn du ![]() ![]() |
AW: FindFirstFileEx
Das dachte ich auch, als ich die Hilfe gelesen hatte, aber in windows.pas steht:
Delphi-Quellcode:
Bei beiden Werten kommt dasselbe Ergebnis.
type
_FINDEX_INFO_LEVELS = (FindExInfoStandard, FindExInfoMaxInfoLevel); |
AW: FindFirstFileEx
Zitat:
|
AW: FindFirstFileEx
In neueren Windows (ich glaub ab Vista oder 7) wird standardmäßig erstmal kein Kurzname mehr erstellt (solange er nicht benötigt oder gezielt erstellt wurde) ... so hat man in Zukunft (vorallem wenn es mal keine ANSI-Programme mehr gibt) endlich Ruhe mit den Kurznahmen. :angle:
|
AW: FindFirstFileEx
Für wen es interessiert ... ich habe es dzt so gelöst:
Delphi-Quellcode:
CompareWildString ist aus der CodeLib, himitsu's Variante war mir zuviel Aufwand hier.
lhFoundFile := THandle(
Windows.FindFirstFileEx( PWideChar(inPath + lsFileMask) , lIndexInfoLevels , lfdStruct , lIndexSearchOps , nil , ldwAdditionalFlags ) ); if (lhFoundFile <> INVALID_HANDLE_VALUE) then begin repeat lsFileNameOnly := ExtractFileName(string(lfdStruct.cFileName)); if (0 = (lfdStruct.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)) and CompareWildString(UpperCase(lsFileMask), UpperCase(lsFileNameOnly)) // <= das ist der Trick then begin // gefunden! end; until not Windows.FindNextFile(lhFoundFile, lfdStruct^); end; Windows.FindClose(lhFoundFile); Der Witz an FindFirstFileEx ist, dass es (scheinbar) x-fach schneller als FindFirst ist. Daher möchte ich es unbedingt verwenden. (Wobei der hier gefixte Fehler auch bei FindFirst auftritt). |
AW: FindFirstFileEx
Zitat:
Delphi-Quellcode:
wirklich?
ExtractFileName
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz