![]() |
Ordner nicht leer
Hallo, ich brauche eine Funktion, die einen Ordner darauf prüft ob er Dateien hat. Also wenn er andere Ordner beinhaltet, soll die Funktion false zurückgeben. Darauf hin habe ich diese funktion hier gefunden.
Code:
//returns true if a given directory is empty, false otherwise
function 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; ![]() aber mein delphi 6 kann es nicht kompilieren, es sagt (FindNext(searchRec) 0) da fehlt ein semikolon?? |
AW: Ordner nicht leer
Vor der "0" fehlt "<>".
Hier ein , finde ich, besserer ![]()
Delphi-Quellcode:
// Diese Funktion gibt true zurück, falls Directory ein leeres Verzeichnis ist.
// This function returns true if Directory is an empty directory. function DirectoryIsEmpty(Directory: string): Boolean; var SR: TSearchRec; i: Integer; begin Result := False; FindFirst(IncludeTrailingPathDelimiter(Directory) + '*', faAnyFile, SR); for i := 1 to 2 do if (SR.Name = '.') or (SR.Name = '..') then Result := FindNext(SR) <> 0; FindClose(SR); end; // Beispiel: // Example: procedure TForm1.Button1Click(Sender: TObject); begin if DirectoryIsEmpty('C:\test') then Label1.Caption := 'empty' else Label1.Caption := 'not empty'; end; |
AW: Ordner nicht leer
Hallo KodeZwerg,
leider bekomme ich "nicht leer", also false, wenn in dem Ordner andere Ordner drin sind. |
AW: Ordner nicht leer
Wenn Unterverzeichnisse enthalten sind, ist das Haupt-Verzeichniss nicht leer, also ist Dein beschriebener Rückgabewert korrekt.
Man kann diese Funktion erweitern indem man, das muss dann leider sein, noch alle gefundendene Elemente auf sein Attribut abgleicht. (dauert halt länger) Nur hier im Editor schnell mal was zusammengepopelt.... ungetestet...
Delphi-Quellcode:
function CheckIfFilesInPath(const Path: string): Boolean;
var SR: TSearchRec; begin Result := False; if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then begin repeat if (SR.Attr <> faDirectory) then begin Result := True; Break; end; until FindNext(SR) <> 0; FindClose(SR); end; end; So könnte was draus werden... teste mal und viel glück :-) |
AW: Ordner nicht leer
Da fehlt ein
Delphi-Quellcode:
.
=
Tipp: Vergleich es mal mit der Zeile darüber. :zwinker: Allerdings ist das etwas wage, denn die Funktion geht "blind" davon aus dass es . und .. gibt, also ab mindestens 3 "Einträgen" existiert mindestens eine Datei (könnte aber auch ein Verzeichnis sein). Besser ist es in einer "normalen" suchschleife durchzulaufen, vor Variable(n) auf False zu setzen, die Dateien . und .. zu ignorieren, und dann jeweils die Attribute zu prüfen (Datei oder Verzeichnis) und entsprechend die Variable(n) auf True zu setzen. Ist/Sind die Variable(n) auf True, kann die Schleife vorzeitig abgebrochen werden. (Das Ergebnis steht ja schon fest) [edit] siehe KodeZwerg |
AW: Ordner nicht leer
Hallo,
es ist ratsam, anstelle von
Delphi-Quellcode:
einen qualifizierten Bezeichner
FindClose(SR);
Delphi-Quellcode:
zu verwenden, weil es u. U. Konflikt geben kann mit der gleichnamigen Procedure
System.SysUtils.FindClose(SR);
Delphi-Quellcode:
, die allerdings einen anderen Datentyp erwartet.
WinAPI.Windows.FindClose(SR);
Gruß, Andreas |
AW: Ordner nicht leer
Ist es gut so?
Code:
@Andreas13
function TForm1.CheckIfFilesInPath(const Path: string): Boolean;
var MySearch: TSearchRec; FindResult: Integer; begin result := false; FindResult:=FindFirst(Path+'\*.*', faAnyFile, MySearch); while (FindResult = 0) do begin if (MySearch.Name<>'.') and (MySearch.Name<>'..') and (MySearch.Attr <> faDirectory) then begin result := true; break; end; FindResult := FindNext(MySearch); end; FindClose(MySearch); end; das konnte ich so nicht kompilieren, ich bekomme den Fehler
Code:
das habe ich bei den Uses aber angebunden. Vielleicht liegt es aber an meinem uralten Delphi 6
[Fehler] trash.pas(213): Undefinierter Bezeichner: 'SysUtils'
|
AW: Ordner nicht leer
Kein Problem: Wahrscheinlich hat Delphi 6 auch noch kein WinAPI.Windows, so daß es dort (noch) keinen Konflikt geben kann.
Andreas |
AW: Ordner nicht leer
Anderer Vorschlag:
Delphi-Quellcode:
function DirContainsFiles(const Dirname: string): Boolean;
var Rec: TSearchRec; SearchPattern: string; begin Result := false; SearchPattern := IncludeTrailingBackslash(Dirname) + '*.*'; if FindFirst(SearchPattern, faAnyFile, Rec) = 0 then try repeat if Rec.Attr and faDirectory = 0 then Result := true; until (FindNext(Rec) <> 0) or Result; finally SysUtils.FindClose(Rec); end; end; |
AW: Ordner nicht leer
Hallo Deddyh! Könntest du bitte die Zeile hier erklären`?
Code:
if Rec.Attr and faDirectory = 0 then
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 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