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 Prüfen ob Ordner, Unterordner hat (https://www.delphipraxis.net/68216-pruefen-ob-ordner-unterordner-hat.html)

SirThornberry 26. Apr 2006 13:23


Prüfen ob Ordner, Unterordner hat
 
Hallo,

wie kann ich schnell prüfen ob ein Ordner einen Unterordner hat?
Zur versuche ich mit
Delphi-Quellcode:
FindFirst(Folder, faDirecotry, LSearchRec)
[...]
zu prüfen ob im Suchergebnis ein Ordner ist. Jedoch werden bei der Angabe von "faDirectory" nicht nur Ordner zurück geliefert sondern auch Dateien. Wenn ich also einen Ordner mit 5000 Dateien hab und prüfen will ob in diesem Ordner ein Unterordner existiert, gehe ich mit FindFirst-FindNext 5000 dateien durch um dann festzustellen,dass kein Ordner dabei ist. Das muss doch auch irgendwie effektiver funktionieren.

s-off 26. Apr 2006 13:31

Re: Prüfen ob Ordner, Unterordner hat
 
Hallo,

das wird Dir helfen:

Delphi-Quellcode:
//Unterverzeichnisse eines bestimmten Verzeichnisses einlesen
procedure GetSubDirs(const sRootDir: string; slDirectories: TStrings);
var
   srSearch: TSearchRec;
   sSearchPath: string;
   slSub: TStrings;
begin
   Screen.Cursor := crHourGlass;
   slSub := TStringList.Create;
   slDirectories.BeginUpdate;
   try
      sSearchPath := sRootDir;
      if FindFirst(sSearchPath + '*', faDirectory, srSearch) = 0 then
         repeat
            if ((srSearch.Attr and faDirectory) = faDirectory) and
               (srSearch.Name <> '.') and
               (srSearch.Name <> '..') then begin
               slDirectories.Add(sSearchPath + srSearch.Name);
               slSub.Add(sSearchPath + srSearch.Name);
            end;
         until
            (FindNext(srSearch) <> 0);

      FindClose(srSearch);
   finally
      slDirectories.EndUpdate;
      FreeAndNil(slSub);
      Screen.Cursor := crDefault;
   end;
end;

himitsu 26. Apr 2006 13:32

Re: Prüfen ob Ordner, Unterordner hat
 
Eigentlich sollten bei Angabe von faDirecotry nur Verzeichnisse zurückgeliefert werden?

'ne Andere Möglichkeit gibt's eigentlich nicht, außer daß du es ja auch mal direkt mit der WinAPI versuchen könntest. :gruebel:

Mal sehn wan ich dazu komme, daheim hab ich 'ne FindFirst, wo man die Attribute getrennt angeben kann, also Benötigte und Auszuschließende, aber intern sucht die auch alle 500 Dateien ab ._.

@s-off: wenn das FindFirst bei ihm schon nichts bringt, dann wird es auch nicht viel bringen, wenn man das Problem nur auslagert ;)
(also deine Funktion würde demnach auch alle 500 Dateien durchsuchen)

marabu 26. Apr 2006 13:34

Re: Prüfen ob Ordner, Unterordner hat
 
Hallo Jens,

so wie du hat auch Microsoft gedacht und die API Funktion FindFirstFileEx() erfunden. Beim Parameter FINDEX_SEARCH_OPS kannst du FindExSearchLimitToDirectories angeben. Ab Windows NT 4.0.

Grüße vom marabu

SirThornberry 26. Apr 2006 13:37

Re: Prüfen ob Ordner, Unterordner hat
 
@himitus: ich werds wohl wirklich direkt mit der Winapi versuchen müssen. Hab grad feststellen müssen das FindFirst intern FindFirstFile nutzt was nur einen Dateinamen erwartet. Das ergebnis welches dann zurück geliefert wird, wird dann gefiltert und mir gegebenfalls zurück gegeben. Das heißt der Filter ist innherlab der Funktion FindFirst, praktischer wäre aber den Filter direkt beim Betriebssystem anzuwenden was nur mit FindFirstFileEx geht.

@s-off: Genau so hab ich es ja bisher (nur das ich abbreche sobald ich den ersten Ordner gefunden habe). Aber bei der Variante werden trotzdem alle Dateien mit durchgegangen womit das ganze recht langsam wird.

[Edit]
@marabu: Hab meinen Beitrag mal abesendet trotz deines Hinweises auf FindFirstFileEx da es mir zu schade um das bereits getippte war[/Edit]

SirThornberry 26. Apr 2006 14:07

Re: Prüfen ob Ordner, Unterordner hat
 
laut msdn ist FindExSearchLimitToDirectories noch für die Zukunft. Ich habs auch unter WinXP-Professional probiert und hatte leider keinen Erfolg. Es werden trotzdem alle Dateien gefunden.

himitsu 28. Apr 2006 11:29

Re: Prüfen ob Ordner, Unterordner hat
 
Selbst wenn das mit FindFirstFileEx funktioniert, würde es ja intern auch alle dateien durchsuchen und dir dann die gefilterte Liste geben.

Ich hab jetzt wenigastens eine Vesion, welche funktioniert (mit FindFirstFile) und nicht erst seit WinNT, aber werd ich micht nun hüten das noch nach FindFirstFileEx abzuändern ._.


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