AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Ordner nicht leer

Ein Thema von kagi3624 · begonnen am 2. Jul 2020 · letzter Beitrag vom 2. Jul 2020
Antwort Antwort
Seite 1 von 3  1 23   
kagi3624

Registriert seit: 3. Feb 2020
138 Beiträge
 
Delphi 6 Enterprise
 
#1

Ordner nicht leer

  Alt 2. Jul 2020, 09:49
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;
http://delphi.cjcsoft.net/viewthread.php?tid=46131

aber mein delphi 6 kann es nicht kompilieren, es sagt (FindNext(searchRec) 0) da fehlt ein semikolon??
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Ordner nicht leer

  Alt 2. Jul 2020, 09:58
Vor der "0" fehlt "<>".

Hier ein , finde ich, besserer Vorschlag:

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;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
kagi3624

Registriert seit: 3. Feb 2020
138 Beiträge
 
Delphi 6 Enterprise
 
#3

AW: Ordner nicht leer

  Alt 2. Jul 2020, 10:09
Hallo KodeZwerg,

leider bekomme ich "nicht leer", also false, wenn in dem Ordner andere Ordner drin sind.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Ordner nicht leer

  Alt 2. Jul 2020, 10:22
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
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Ordner nicht leer

  Alt 2. Jul 2020, 10:23
Da fehlt ein = .
Tipp: Vergleich es mal mit der Zeile darüber.


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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 2. Jul 2020 um 10:29 Uhr)
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
711 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Ordner nicht leer

  Alt 2. Jul 2020, 10:31
Hallo,
es ist ratsam, anstelle von FindClose(SR); einen qualifizierten Bezeichner System.SysUtils.FindClose(SR); zu verwenden, weil es u. U. Konflikt geben kann mit der gleichnamigen Procedure WinAPI.Windows.FindClose(SR); , die allerdings einen anderen Datentyp erwartet.
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
kagi3624

Registriert seit: 3. Feb 2020
138 Beiträge
 
Delphi 6 Enterprise
 
#7

AW: Ordner nicht leer

  Alt 2. Jul 2020, 10:44
Ist es gut so?

Code:
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;
@Andreas13
das konnte ich so nicht kompilieren, ich bekomme den Fehler
Code:
[Fehler] trash.pas(213): Undefinierter Bezeichner: 'SysUtils'
das habe ich bei den Uses aber angebunden. Vielleicht liegt es aber an meinem uralten Delphi 6
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
711 Beiträge
 
Delphi XE5 Professional
 
#8

AW: Ordner nicht leer

  Alt 2. Jul 2020, 10:48
Kein Problem: Wahrscheinlich hat Delphi 6 auch noch kein WinAPI.Windows, so daß es dort (noch) keinen Konflikt geben kann.
Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.536 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Ordner nicht leer

  Alt 2. Jul 2020, 10:53
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
kagi3624

Registriert seit: 3. Feb 2020
138 Beiträge
 
Delphi 6 Enterprise
 
#10

AW: Ordner nicht leer

  Alt 2. Jul 2020, 11:04
Hallo Deddyh! Könntest du bitte die Zeile hier erklären`?

Code:
if Rec.Attr and faDirectory = 0 then
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 03:32 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