AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

leere Ordner Finden (mit Subdirs)

Ein Thema von Patrick · begonnen am 11. Jan 2005 · letzter Beitrag vom 28. Feb 2005
Antwort Antwort
Seite 1 von 2  1 2      
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#1

leere Ordner Finden (mit Subdirs)

  Alt 11. Jan 2005, 17:54
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;
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: leere Ordner Finden (mit Subdirs)

  Alt 11. Jan 2005, 18:21
Moin Patrick,

das hier solltest Du weglassen:

if (SR.Attr = faDirectory) then denn in der Filelist wird so nichts ankommen können.

if (SR.Attr and faDirectory) <> 0 then deckt den Fall der Gleichheit schon mit ab.
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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: leere Ordner Finden (mit Subdirs)

  Alt 11. Jan 2005, 19:08
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: leere Ordner Finden (mit Subdirs)

  Alt 11. Jan 2005, 19:44
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: leere Ordner Finden (mit Subdirs)

  Alt 11. Jan 2005, 19:55
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
  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: leere Ordner Finden (mit Subdirs)

  Alt 11. Jan 2005, 20:08
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)
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
 
#7

Re: leere Ordner Finden (mit Subdirs)

  Alt 11. Jan 2005, 20:52
Mit folgender Funktion solltest du es hinnbekommen
Delphi-Quellcode:
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;
Beispielaufruf um alle Datei-Leeren verzeichnisse von C aufzulisten
Delphi-Quellcode:
var LList: TStringList;
begin
  LList := TStringList.Create;
  GetFileEmptyDirs('c:', LList);
  Memo1.Lines.Assign(LList);
  LList.Free;
end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#8

Re: leere Ordner Finden (mit Subdirs)

  Alt 12. Jan 2005, 17:54
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!!!
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: leere Ordner Finden (mit Subdirs)

  Alt 28. Feb 2005, 07:05
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.

Als Grundlage wollte ich diesen Code nehmen:
Delphi-Quellcode:
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;
Zurückgegeben werden sollte ein dynamisches Array mit den leeren Ordnern.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: leere Ordner Finden (mit Subdirs)

  Alt 28. Feb 2005, 08:26
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..
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:43 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