Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ordner prüfen ob er leer ist (https://www.delphipraxis.net/110375-ordner-pruefen-ob-er-leer-ist.html)

SaFu 17. Mär 2008 09:13


Ordner prüfen ob er leer ist
 
Hi

gibt es eine Möglichkeit zu prüfen ob ein Ordner lee ist oder nicht

z.b.
Delphi-Quellcode:

if Directory(C:\test) = Empty then
showmessage ('leer');
Gruß Sascha

SirThornberry 17. Mär 2008 09:18

Re: Ordner prüfen ob er leer ist
 
mit FindFirst und FindNext schauen ob etwas im ordner gefunden wird :)

Aurelius 17. Mär 2008 09:19

Re: Ordner prüfen ob er leer ist
 
da bräuchte man doch nur per FindFirst() zu gucken ob du was findest...

//Da war Sir Thornberry ein bisschen schneller :D

SirThornberry 17. Mär 2008 09:27

Re: Ordner prüfen ob er leer ist
 
Aber Vorsicht - FindFirst alleine geht schief weil in jedem Ordner "." und ".." gefunden wird.

Aurelius 17. Mär 2008 09:30

Re: Ordner prüfen ob er leer ist
 
Nicht gewusst :thumb:

SaFu 17. Mär 2008 09:31

Re: Ordner prüfen ob er leer ist
 
so ähnlich

Delphi-Quellcode:
if FindFirst(Form1.ServerPfad + 'Bilder',faAnyFile, SR) = 0 then

Klaus01 17. Mär 2008 09:36

Re: Ordner prüfen ob er leer ist
 
Zitat:

Zitat von fuknersascha
so ähnlich

Delphi-Quellcode:
if FindFirst(Form1.ServerPfad + 'Bilder',faAnyFile, SR) = 0 then

Ich würde die Suche etwas spezifizieren.

Delphi-Quellcode:
if FindFirst(Form1.ServerPfad + 'Bilder\*.jpg',faAnyFile, SR) = 0 then
Denn bei Deiner Abfrage werden auch die . und .. Verzeichnisse mit ausgewertet.
Wie der Sir schon gesagt hat.

Grüße
Klaus

taaktaak 17. Mär 2008 09:46

Re: Ordner prüfen ob er leer ist
 
Hmm, schon richtig,
aber bei Angabe eines Extends wird nicht allgemeingültig geprüft, ob das Verzeichnis leer ist. In diesem Fall wird lediglich geprüft, ob sich Dateien mit der spezifizierten Endung im Verzeichnis befinden.

Klaus01 17. Mär 2008 09:48

Re: Ordner prüfen ob er leer ist
 
Zitat:

Zitat von taaktaak
Hmm, schon richtig,
aber bei Angabe eines Extends wird nicht allgemeingültig geprüft, ob das Verzeichnis leer ist. In diesem Fall wird lediglich geprüft, ob sich Dateien mit der spezifizierten Endung im Verzeichnis befinden.

Hallo Ralph,

das ist schon richtig was Du schreibst.
Ich ging nur davon aus, dass sich im Ordner Bilder auch nur jpg-Bilder befinden.

Grüße
Klaus

SaFu 17. Mär 2008 09:55

Re: Ordner prüfen ob er leer ist
 
Ja mein problem ist ja noch das ich auf drei Formate prüfen muss (jpg,gif und bmp) also fühge ich es einfach mit einem OR an oder?

einfacher wäre es natürlich ob es kommplett leer ist.

taaktaak 17. Mär 2008 10:00

Re: Ordner prüfen ob er leer ist
 
Mit OR die Strings verketten? Nee, wie sollte das funktionieren?

Klaus01 17. Mär 2008 10:03

Re: Ordner prüfen ob er leer ist
 
Hallo Sascha,

habe noch diesen Code gefunden.
Dort wird auf *.* geprüft.

Grüße
Klaus

taaktaak 17. Mär 2008 10:09

Re: Ordner prüfen ob er leer ist
 
Das ist dort ja nahezu genial gelöst!

SaFu 17. Mär 2008 10:32

Re: Ordner prüfen ob er leer ist
 
Also ich kann machen was ich will ich bekomm immer nur ein false rause
Delphi-Quellcode:

directory:= (Form1.ServerPfad + 'DokumentenurRTF');
isEmpty := IsDirectoryEmpty(directory) ;

ShowMessage(BoolToStr(isEmpty,true)) ;

function TForm5.IsDirectoryEmpty(const directory: string): boolean;
var
  searchRec :TSearchRec;
begin
  try
   result := (FindFirst(directory+'\*.*', faAnyFile, searchRec) = 0) AND
             (FindNext(searchRec) = 0) AND
             (FindNext(searchRec) <> 0) ;
  finally
    FindClose(searchRec) ;
  end;
end;
mach ich was falsch

SirThornberry 17. Mär 2008 10:37

Re: Ordner prüfen ob er leer ist
 
autsch. Die Lösung gefällt mir überhaupt nicht. Aber das ist geschmacksache. Am besten weißt du die Ergebnisse erstmal auf temporäre Variablen zu dann kannst du debuggen warum du nicht das gewünschte Ergebnis bekommst.

SaFu 17. Mär 2008 10:43

Re: Ordner prüfen ob er leer ist
 
Das ergebnis ist doch auf eine Variable zugewiesen

Delphi-Quellcode:
isEmpty : boolean;
oder verstehe ich das falsch

taaktaak 17. Mär 2008 10:51

Re: Ordner prüfen ob er leer ist
 
Moin, Moin SirThornberry!
Was gefällt dir an der Lösung nicht (abgesehen davon, dass sie keine korrekten Ergebnisse liefert) - Subdirectories werden in der Originalform leider auch als Files erkannt! Aber sonst ist sie doch optinal kurz: FindFirst findet ".", das erste FindNext findet "..", das zweite FindNext enstscheidet dann (leider falsch)

SirThornberry 17. Mär 2008 10:57

Re: Ordner prüfen ob er leer ist
 
mir gefällt an der Lösung zum Beispiel nicht das FindClose auch aufgerufen wird wenn FindFirst fehlschlägt. Das ist zwar erlaubt aber überflüssig. Der Sinn von Try-Finally bleibt mir an der Stelle auch Schleierhaft. Es ist nirgends Code der eine Exception erzeugen könnte.

Die Muhkuh 17. Mär 2008 10:59

Re: Ordner prüfen ob er leer ist
 
Hi,

ich werfe mal diese Funktion in den Raum:

Delphi-Quellcode:
function IsDirectoryEmpty(Directory: String): Boolean;
var
  SR: TSearchRec;
begin
  Result := false;

  if FindFirst(Directory, faAnyFile, SR) = 0 then
  begin
    repeat
       Result := (SR.Name <> '.') and (SR.Name <> '..');
    until Result;

    FindClose(SR);
  end;
end;

taaktaak 17. Mär 2008 11:00

Re: Ordner prüfen ob er leer ist
 
Ja, das sind nachvollziehbare Argumente :hi:

DeddyH 17. Mär 2008 11:02

Re: Ordner prüfen ob er leer ist
 
@Manuel: Fehlt da nicht ein FindNext?

taaktaak 17. Mär 2008 11:03

Re: Ordner prüfen ob er leer ist
 
@Muhkuh: Aber auch deine Funktion erkennt Directories als Files - oder??

SaFu 17. Mär 2008 11:04

Re: Ordner prüfen ob er leer ist
 
jetzt bin total verwirrt bei mir funktioniert so gut wie keine lösung richtig

DeddyH 17. Mär 2008 11:05

Re: Ordner prüfen ob er leer ist
 
Zitat:

Zitat von taaktaak
@Muhkuh: Aber auch deine Funktion erkennt Directories als Files - oder??

Was wäre denn da so schlimm daran? Ein Verzeichnis, das Unterverzeichnisse enthält, ist eben auch nicht leer.

taaktaak 17. Mär 2008 11:08

Re: Ordner prüfen ob er leer ist
 
Wieso schlimm, kommt natürlich auf die Aufgabenstellung an :mrgreen:

bluesbear 17. Mär 2008 11:10

Re: Ordner prüfen ob er leer ist
 
Jetzt kam ich ins grübeln, wie ich das eigentlich mache. Ganz tief unten in der Code-Kiste fand ich die Kanone, mit der ich auf den Spatz schieße:
Delphi-Quellcode:
procedure GetListOfFiles(FileList: TStrings; Source, FileMask: string;
    Attributes, IgnoreAttributes: Integer; Recurse: Boolean);
var SearchDir: string;
    SearchRec: TSearchRec;
    Res : Integer;
    DirList : TStringList;
    i : Integer;
begin
  DirList := TStringList.Create;
  try
    SearchDir := AddBackSlashL(Source);
    Res := SysUtils.FindFirst(SearchDir + FileMask, Attributes, SearchRec);
    while (Res = 0) and (SearchRec.Name > '') do begin
      if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') and
         ((Attributes = faAnyFile) or ((SearchRec.Attr and Attributes) <> 0)) and
         ((IgnoreAttributes = 0) or ((SearchRec.Attr and IgnoreAttributes) = 0)) then begin
        FileList.Add(SearchDir + SearchRec.Name);
      end;
      Res := FindNext(SearchRec);
    end;
    if Recurse and ((Attributes and faDirectory) = 0) then begin  // Unterordner durchsuchen
      GetListOfFiles(DirList, Source, '*.*', faDirectory, 0, True);
      for i:=0 to Pred(DirList.Count) do begin
        GetListOfFiles(FileList, DirList[i], FileMask, Attributes, 0, True);
      end;
    end;
  finally
    SysUtils.FindClose(SearchRec);
    DirList.Free;
  end;
end;

function IsDirEmpty(const Dir: string): Boolean;
var SL : TStringList;
begin
  SL := TStringList.Create;
  try
    GetListOfFiles(SL, Dir, '*.*', faAnyFile - faDirectory, 0, False);
    Result := SL.Count = 0;
  finally
    SL.Free;
  end;
end;
Nu, der Spatz ist garantiert tot! :mrgreen:

DeddyH 17. Mär 2008 11:17

Re: Ordner prüfen ob er leer ist
 
Noch' n Gedicht :mrgreen:
Delphi-Quellcode:
function IsFolderEmpty(const Foldername: string): Boolean;
var Rec: TSearchRec;
begin
  Result := false;
  if FindFirst(IncludeTrailingPathDelimiter(Foldername) + '*.*',faAnyFile,Rec) = 0 then
    begin
      repeat
        Result := (Rec.Name = '.') or (Rec.Name = '..');
      until (FindNext(Rec) <> 0) or not Result;
      FindClose(Rec);
    end;
end;

Die Muhkuh 17. Mär 2008 11:22

Re: Ordner prüfen ob er leer ist
 
Zitat:

Zitat von DeddyH
@Manuel: Fehlt da nicht ein FindNext?

:oops: Asche auf mein Haupt.

SaFu 22. Mär 2008 20:35

Re: Ordner prüfen ob er leer ist
 
Ok Danke funktioniert so

gruss sascha

Christian Seehase 8. Mai 2008 23:21

Re: Ordner prüfen ob er leer ist
 
Zitat:

Zitat von DeddyH
Noch' n Gedicht :mrgreen:
Delphi-Quellcode:
function IsFolderEmpty(const Foldername: string): Boolean;
var Rec: TSearchRec;
begin
  Result := false;
  if FindFirst(IncludeTrailingPathDelimiter(Foldername) + '*.*',faAnyFile,Rec) = 0 then
    begin
      repeat
        Result := (Rec.Name = '.') or (Rec.Name = '..');
      until (FindNext(Rec) <> 0) or not Result;
      FindClose(Rec);
    end;
end;

Ich hätte dazu noch eine Idee ;-)

Delphi-Quellcode:
function IsDirectoryEmtpy(const AsFolder : string) : Boolean;

var
  sr : TSearchRec;

begin
  Result := FindFirst(IncludeTrailingPathDelimiter(AsFolder)+'*.*',faAnyFile,sr) = 0;
  if Result then begin
    try
      Result := (FindNext(sr) = 0) and (FindNext(sr) <> 0);
    finally
      FindClose(sr);
    end;
  end;
end;

himitsu 9. Mai 2008 00:04

Re: Ordner prüfen ob er leer ist
 
Zitat:

Zitat von Christian Seehase
Delphi-Quellcode:
Result := (FindNext(sr) = 0) and (FindNext(sr) <> 0);

teste dieses z.B. mal an einem Rootverzeichnis wie "C:\" :twisted:

marabu 9. Mai 2008 06:00

Re: Ordner prüfen ob er leer ist
 
Moin,

nicht Delphi, aber Windows bringt die gesuchte Funktion bereits mit:

Delphi-Quellcode:
const
  shlwapi = 'shlwapi.dll';

function PathIsDirectoryEmpty(pszPath: PAnsiChar): BOOL; stdcall;
    external shlwapi name 'PathIsDirectoryEmptyA';

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  isEmpty: Boolean;
begin
  isEmpty := PathIsDirectoryEmpty(PChar(Edit.Text));
  ShowMessage(BoolToStr(isEmpty, True));
end;
Da auch nicht existierende Verzeichnisse als "nicht leer" ausgewiesen werden, wird man wohl in der Regel zusätzlich SysUtils.DirectoryExists() einsetzen.

Grüße vom marabu

SaFu 9. Mai 2008 07:47

Re: Ordner prüfen ob er leer ist
 
Also die Lösung vom Klaus01 funktioniert bis jetzt ohne Probleme, gut ich muss dazu sagen das ich dieses noch nicht groß getestet habe aber im groben funzt es.

Ich bin natürlich für verbesserungen offen


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