![]() |
leere Ordner Finden (mit Subdirs)
Tach,
Ich möchte einen Ordnerbaum durchsuchen. Und die Ordner, die leer sind, sollen aufgelistet werden. Das sollte so nicht schwer sein, also setze ich noch einen drauf: Wenn in einem Teilbaum alle Ordner leer sind, so will ich nur den "Wurzelordner" des Teilbaum s aufgelistet haben. In dem Teilbaum können so viel Ordner sein, wie was weis ich. Solange keine Datei dabei ist geht das klar. Bisher habe ich das zusammengestückelt:
Delphi-Quellcode:
procedure ListEmptyDir(const Path: string; FileList : TStrings);
var SR : TSearchRec; begin if FindFirst(Path + '*.*', faDirectory, SR) = 0 then begin repeat if (SR.Attr and faDirectory) <> 0 then begin if (SR.Name <> '.') and (SR.Name <> '..') then ListFileDir(Path+SR.Name+'\',FileList, subdir); end else if (SR.Attr = faDirectory) then FileList.Add(path+SR.Name); until FindNext(SR) <> 0; FindClose(SR); end; end; |
Re: leere Ordner Finden (mit Subdirs)
Moin Patrick,
das hier solltest Du weglassen:
Delphi-Quellcode:
denn in der Filelist wird so nichts ankommen können.
if (SR.Attr = faDirectory) then
Delphi-Quellcode:
deckt den Fall der Gleichheit schon mit ab.
if (SR.Attr and faDirectory) <> 0 then
Wenn (SR.Attr and faDirectory) <> 0 false ist, kann SR.Attr = faDirectory niemals zutreffen. Für Dein eigentliches Problem fällt mir allerdings so auf Anhieb keine schöne Lösung ein. Du könntest die Directoryliste sortieren, dann rückwärts durchgehen, und prüfen, ob es einen Eintrag in der Dateiliste gibt, in der das Verzeichnis existiert. Wenn nicht kann die Zeile in der Liste bleiben, ansonsten wird sie gelöscht. |
Re: leere Ordner Finden (mit Subdirs)
Moin!
Ist doch relativ einfach: Ändere die Procedure zu einer Funktion die einen Boolean zurück gibt. Dieser Boolean gibt an, ob ein Verzeichnis leer ist (Result := True) oder nicht (Result := False). Nun kannst du beim durchsuchen des aktuellen Ordners erstmal so vorgehen, das du Result auf False setzt, wenn du min. eine Datei findest. Wenn du ein Verzeichnis findest, dann die Funktion selber mit dem Verzeichnis wieder aufrufen - wenn der Rückgabewert ein True ist und du aber schon min. eine Datei gefunden hast (Result = False), dann diesen Ordner der Ausgabe zuordnen. Und so hast du mit der Rekursion eine einfache Lösung. (Wobei ein "leeres" Verzeichnis eigentlich nur "." und ".." enthält - also auch keine Verzeichnisse - sonst wäre es nicht leer...) MfG Muetze1 |
Re: leere Ordner Finden (mit Subdirs)
du könntest eine funktion schreiben die einfach nur die dateien die dateien in einem ordner zählt. Und für die unterordner sich selbst mit dem unterordner als parameter aufruft. Wenn nach dem aufruf aller unterordner die dateizahl noch auf 0 ist weißt du das da keine dateien drin sind.
|
Re: leere Ordner Finden (mit Subdirs)
Moin!
Und was ist, wenn im Sub Dir des Sub Dirs keine Dateien sind? Dann ist der Zähler schon auf > 0. Und wenn du den Zähler nicht weiter gibst, dann ist das Problem wie die anderen Sub Dirs wissen, das keiner ihrer Sub Dirs Dateien hat? MfG Muetze1 |
Re: leere Ordner Finden (mit Subdirs)
warum sollte der zähler dann > 0 sein?
Wenn ich nach dem Prinzip arbeite: Result := DateianzahlImOrdner + DateianzahlInUnterOrdnern; wobei DateianzahlInUnterOrdnern einer der funktionsaufrufe für einen unterordner ist. (hab ja erst vor kurzem ne funktion zum löschen gefüllter verzeichnisse geschrieben, und da ist das auch nicht anders, da muss mann ja auch erst die gefüllten Verzeichnisse leeren, und die unterverzeichnisse davon etc. Und das hat da auch geklappt) |
Re: leere Ordner Finden (mit Subdirs)
Mit folgender Funktion solltest du es hinnbekommen
Delphi-Quellcode:
Beispielaufruf um alle Datei-Leeren verzeichnisse von C aufzulisten
procedure GetFileEmptyDirs(AStartDir: String; ADestList: TStrings);
function LGetFileEmptyDirs(LDir: String; LDestList: TStrings): Boolean; var LSRec: TSearchRec; LHasFiles, LFilesInFolder: Boolean; LEmptyDirs: TStringlist; begin //erstmal schauen ob wir dateien haben (wenn ja müssen wir eventuell ordner hinzufügen) LHasFiles := False; if FindFirst(LDir + '\*', faAnyFile, LSRec) = 0 then begin repeat if not(faDirectory and LSRec.Attr <> 0) then LHasFiles := True; until (FindNext(LSRec) <> 0) or (LHasFiles); end; FindClose(LSRec); //jetzt alle unterordner durchgehen LEmptyDirs := TStringList.Create; if FindFirst(LDir + '\*', faAnyFile, LSRec) = 0 then begin repeat if (faDirectory and LSRec.Attr <> 0) and (LSRec.Name <> '.') and (LSRec.Name <> '..') then begin LFilesInFolder := LGetFileEmptyDirs(LDir + '\' + LSRec.Name, ADestList); if LFilesInFolder then LHasFiles := True else LEmptyDirs.Add(LDir + '\' + LSRec.Name); end; until (FindNext(LSRec) <> 0); end; FindClose(LSRec); if LHasFiles then ADestList.AddStrings(LEmptyDirs); LEmptyDirs.Free; //funktion verlassen und mitteilen ob wir dateien in Ordner haben result := LHasFiles; end; begin ADestList.Clear; if LGetFileEmptyDirs(AStartDir, ADestList) = False then ADestList.Add(AStartDir); end;
Delphi-Quellcode:
var LList: TStringList;
begin LList := TStringList.Create; GetFileEmptyDirs('c:', LList); Memo1.Lines.Assign(LList); LList.Free; end; |
Re: leere Ordner Finden (mit Subdirs)
Jep, das ist genau das, was ich gesucht habe! Ich habe bis heute noch keine Ahnung wie der Kram mit "FindNext" funktioniert, aber die Prozedur läuft super, danke!!!
|
Re: leere Ordner Finden (mit Subdirs)
Ich brauche jetzt auch mal so eine Funktion. Aber die von SirThornberry sieht mir doch recht kompliziert aus. Gibt es da keine einfachere Möglichkeit solch eine Liste zu erstellen? Btw. verstehe ich sie nicht so ganz. :gruebel:
Als Grundlage wollte ich diesen Code nehmen:
Delphi-Quellcode:
Zurückgegeben werden sollte ein dynamisches Array mit den leeren Ordnern.
function FindEmptyFolders(RootFolder: string; Mask: string = '*.*'; Recurse:
Boolean = True): TStringDynArray; var wfd: TWin32FindData; hFile: THandle; begin if AnsiLastChar(RootFolder)^ <> '\' then RootFolder := RootFolder + '\'; if Recurse then begin hFile := FindFirstFile(PChar(RootFolder + '*.*'), wfd); if hFile = INVALID_HANDLE_VALUE then begin repeat if wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY then if (string(wfd.cFileName) <> '.') and (string(wfd.cFileName) <> '..') then FindEmptyFolders(RootFolder + wfd.cFileName, Mask, Recurse); until FindNextFile(hFile, wfd) = False; end; end; hFile := FindFirstFile(PChar(RootFolder + '*.*'), wfd); if hFile <> INVALID_HANDLE_VALUE then try repeat if wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <> FILE_ATTRIBUTE_DIRECTORY then begin //...; ShowMessage(RootFolder); end; until FindNextFile(hFile, wfd) = False; finally Windows.FindClose(hFile); end; end; |
Re: leere Ordner Finden (mit Subdirs)
anstelle 2 mal findfirst zu benutzen (auf den Source von mir bezogen) ist es besser einmal dies zu benutzen und dann die files und folders in getrennte stringlists zu speichern, anschließend dann mit ner schleife die listen durchgehen. Durch das 2 malige aufrufen von findfirst ist mein beispiel nicht gerade schnell..
|
Re: leere Ordner Finden (mit Subdirs)
Zitat:
|
Re: leere Ordner Finden (mit Subdirs)
[edit] hab irgendwie den Muetze1 übersehen - das meinte ich :) [/edit]
ps@luckie: wer sagte was von schwer ;) |
Re: leere Ordner Finden (mit Subdirs)
Zitat:
Es kann doch nicht so schwer seine eine Liste der leeren Verzeichnisse zu erhalten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:07 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