![]() |
Prüfen, ob Ordner leer ist
Hallo zusammen,
zum Schutz meiner privaten Daten speicher ich diese auf einer externen Festplatte (Laufwerksbuchstabe P:\), die ich immer abschalte, wenn ich online gehe. Damit ich das Abschalten nicht vergesse, habe ich ein kleines Prog geschrieben, welches gewährleistet, dass ich nur dann online gehen kann, wenn die externe Festplatte tatsächlich abgeschaltet ist, andernfalls bekomme ich einen Warnhinweis. Auf meinem Desktop befindet sich nur eine Verknüpfung zu diesem Prog. Der Code ist simpel
Delphi-Quellcode:
Nun möchte ich als zusätzliche Bedingung für den Start der Online-Verbindung festlegen, dass ein bestimmter Ordner, in dem ich private Daten zwischenspeichere (z.B. D:\Privat\), leer ist.
procedure TForm1.FormCreate(Sender: TObject);
begin if DirectoryExists('P:') then begin Label1.Caption := 'LW abschalten!'; Label1.Visible := True end else begin ShellExecute(Handle, 'open', PChar('C:\Programme\T-Online\T-Online_Software_6\Basis-Software\Basis2\kernel.exe'), nil, nil, sw_Show); Application.Terminate; end; end; Kann mir bitte jemand sagen, mit welchem Befehl man dies prüft? |
Re: Prüfen, ob Ordner leer ist
Ich wuerd es hiermit machen am schluss guckst du halt dann ob der slCurrent Count gleich 0 null wennm er größer als null ist enhält er ja Dateien ...
Delphi-Quellcode:
procedure FindFiles(DirStr,FN : string; slCurrent: TStringlist);
var DirInfo: TSearchRec; R: integer; Mask,Dir : String ; begin Dir := includeTrailingpathDelimiter(Dirstr) ; try R := FindFirst(Dir+ FN, faAnyFile, DirInfo); while R = 0 do begin if ((DirInfo.Attr and faDirectory <> faDirectory) and (DirInfo.Name <> '.') and (DirInfo.Name <> '..') and (DirInfo.Attr and SysUtils.faVolumeID <> SysUtils.faVolumeID)) then begin slCurrent.Add(Dir + DirInfo.Name); end; R := FindNext(DirInfo); end; finally FindClose(DirInfo); end; end; |
Re: Prüfen, ob Ordner leer ist
Danke DeluxXx, werde ich so probieren.
:bounce2: (Ich hatte gehofft, es gibt irgendeine schlankere Möglichkeit) Gruß, |
Re: Prüfen, ob Ordner leer ist
Moin DeluxXx,
ich würd's so machen:
Delphi-Quellcode:
Da mehrere aufeinander folgende Pfadtrenner (\) von Windows als einer angesehen werden, kann man sich die Verwendung von IncludeTrailingPathDelimiter sparen.
function IsEmptyFolder(const AsFolder : string) : boolean;
var sr : TSearchRec; begin Result := FindFirst(AsFolder+'\*.*',faAnyFile,sr) = 0; if not Result then exit; try Result := false; repeat if (sr.Attr and faDirectory) = faDirectory then begin // Verzeichnis? if (sr.Name <> '.') and (sr.Name <> '..') then exit; // "Echtes" Verzeichnis? => Nicht leer end else begin exit; // Datei => Nicht leer end; until FindNext(sr) <> 0; Result := true; finally FindClose(sr); end; end; Ausserdem sollte man auch immer die Resourcenschutzblöcke (try/finally) verwenden. Da . und .. Verzeichnisse sind brauchst Du in Deinem Falle auch nicht darauf zu testen, wenn es sich schon nicht um ein Verzeichnis handelt. |
Re: Prüfen, ob Ordner leer ist
Hallo Christian,
danke erstmal für Deinen Vorschlag. Ehrlich gesagt versteh ichs nicht so ganz. Unklar ist mir vor allem (bei beiden Möglichkeiten), woher das Prog wissen soll, welcher Ordner geprüft wird. Es soll ja nur bei einem ganz bestimmter Ordner (z.B. D:\Privat\) geprüft werden, ob er leer ist. Wo teile ich das dem Programm denn mit?? Gruß, |
Re: Prüfen, ob Ordner leer ist
Das teilst du der Funktioon beim Aufruf mittels der AsFolder Stringkonstante.
Delphi-Quellcode:
function IsEmptyFolder(const AsFolder : string) : boolean; //<-------------
var sr : TSearchRec; begin Result := FindFirst(AsFolder+'\*.*',faAnyFile,sr) = 0; //<---- Das dann hier benutzt wird |
Re: Prüfen, ob Ordner leer ist
Oh Gott!
Vom-Schlauch-runtertret-und-kapier...... Habs ausprobiert. Funzt prima! Thanks all! |
Re: Prüfen, ob Ordner leer ist
[edit] dat alte war Mist (besser lesen sollte ._.)
Delphi-Quellcode:
// faVolumeID = 8
function IsEmptyFolder(const AsFolder : string) : boolean; var sr : TSearchRec; begin Result := FindFirst(AsFolder+'\*.*',faAnyFile,sr) = 0; if not Result then exit; repeat if (sr.Name <> '.') and (sr.Name <> '..') and (sr.Attr and faVolumeID = 0) then begin Result := false; Break; end; until FindNext(sr) <> 0; FindClose(sr); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:31 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 by Thomas Breitkreuz