Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Durchsuchen eines Ordners nach Ordnern schlägt fehl (https://www.delphipraxis.net/90613-durchsuchen-eines-ordners-nach-ordnern-schlaegt-fehl.html)

xZise 20. Apr 2007 14:46


Durchsuchen eines Ordners nach Ordnern schlägt fehl
 
Ich durchsuche mit folgenden Code meine Ordner, und die Ordner des Ordners... Dummerweise erkennt er aber nur eine Datei, obwohl es im übergeben Ordner noch ein weiterer Ordner existiert.
Delphi-Quellcode:
procedure TForm1.ReloadMemos(APath : string; AParent : TTreeNode);
var
   sr : TSearchRec;
begin
   if FindFirst(APath + '*', faAnyFile + faDirectory, sr) = 0 then
     try
        repeat
        case sr.Attr of
          faDirectory : begin
            ReloadMemos(APath + sr.Name + '\', tvMemolist.Items.AddChild(AParent, sr.Name));
          end;
          else begin
             if ExtractFileExt(sr.Name) = '.m2m' then
            begin
               tvMemolist.Items.AddChild(AParent, Copy(sr.Name, 1, Length(sr.Name) - 4));
            end;
          end;        
        end;
        until FindNext(sr) <> 0;
    finally
      FindClose(sr);
    end;
end;

shmia 20. Apr 2007 14:55

Re: Durchsuchen eines Ordners nach Ordnern schlägt fehl
 
Die fa-Konstanten dürfen nicht addiert sondern nur mit and, or oder xor verknüpft werden!
Delphi-Quellcode:
if FindFirst(APath + '*', faAnyFile + faDirectory, sr) = 0 then // Falsch !!!!
if FindFirst(APath + '*', faAnyFile or faDirectory, sr) = 0 then // Richtig !!!

SirThornberry 20. Apr 2007 15:01

Re: Durchsuchen eines Ordners nach Ordnern schlägt fehl
 
zudem solltest du nicht prüfen ob das Attribut = faDirectory ist denn das Attribut kann faDirectory, faArchive, faReadOnly etc. haben. Hat also mehrere Flags gesetzt. So ist unter XP, wenn du mal im Eigenschaften-Dialog eines Ordners die Attribute anschaust, so ziemlich immer das Schreibgeschützt-Flag (faReadOnly) gesetzt. Und somit ist das Attribut nicht mehr faDirectory sondern "faDirectory + faReadOnly". Wie gesagt musst du schauen ob das entsprechende Bit gesetzt ist und nicht ob Attribute einen festen Wert haben.

xZise 20. Apr 2007 18:29

Re: Durchsuchen eines Ordners nach Ordnern schlägt fehl
 
Mit "or" funktionierts...
Aber eine Frage zu Jens:
Wie kann ich den Überprüfen, ob es nun ein Ordner ist?

jfheins 20. Apr 2007 18:32

Re: Durchsuchen eines Ordners nach Ordnern schlägt fehl
 
Delphi-Quellcode:
if ((sr.Attr and faDirectory) = faDirectory) then // Directory
;)

Christian Seehase 20. Apr 2007 18:44

Re: Durchsuchen eines Ordners nach Ordnern schlägt fehl
 
Moin shmia,

Zitat:

Zitat von shmia
Die fa-Konstanten dürfen nicht addiert sondern nur mit and, or oder xor verknüpft werden!
Delphi-Quellcode:
if FindFirst(APath + '*', faAnyFile + faDirectory, sr) = 0 then // Falsch !!!!
if FindFirst(APath + '*', faAnyFile or faDirectory, sr) = 0 then // Richtig !!!

Also das hätte ich jetzt anders kommentiert ;-)

Delphi-Quellcode:
if FindFirst(APath + '*', faAnyFile + faDirectory, sr) = 0 then // Ganz falsch !!!!
if FindFirst(APath + '*', faAnyFile or faDirectory, sr) = 0 then // Funktioniert, ist so aber unnötig !!!
Beim ersten "Ganz falsch", weil es keinen Sinn macht "Alles" (faAnyFile) noch mit einem, wie auch immer gearteten, weiteren Attribut zu verknüpfen. Dank der Addition kommt sogar etwas ungültiges für den Attributwert heraus.
Die Begründung für den zweiten Kommentar kann man auch schon aus dem ersten ablesen. Das Bit, dass durch die Veroderung mit faDirectory garantiert gesetzt werden würde ist in faAnyFile schon gesetzt.

Wozu würdest Du denn den Wert mit XOR verknüpfen?
Ich vermute mal stark, dass Du AND NOT meintest, um ein Bit garantiert zu löschen.


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