AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Prüfen ob Ordner, Unterordner hat
Thema durchsuchen
Ansicht
Themen-Optionen

Prüfen ob Ordner, Unterordner hat

Ein Thema von SirThornberry · begonnen am 26. Apr 2006 · letzter Beitrag vom 28. Apr 2006
Antwort Antwort
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#1

Prüfen ob Ordner, Unterordner hat

  Alt 26. Apr 2006, 14:23
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#2

Re: Prüfen ob Ordner, Unterordner hat

  Alt 26. Apr 2006, 14:31
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: Prüfen ob Ordner, Unterordner hat

  Alt 26. Apr 2006, 14:32
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.

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)
$2B or not $2B
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Prüfen ob Ordner, Unterordner hat

  Alt 26. Apr 2006, 14:34
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Prüfen ob Ordner, Unterordner hat

  Alt 26. Apr 2006, 14:37
@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]
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Prüfen ob Ordner, Unterordner hat

  Alt 26. Apr 2006, 15:07
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: Prüfen ob Ordner, Unterordner hat

  Alt 28. Apr 2006, 12:29
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 ._.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 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