Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit FindFirst (https://www.delphipraxis.net/101544-problem-mit-findfirst.html)

toyoman 15. Okt 2007 11:33


Problem mit FindFirst
 
Delphi-Quellcode:
{Findet alle Dateien im SourcePfad und kopiert auf Networkpfad}
procedure findfiles(Source: string);
var SearchRec: TSearchRec;
begin
  screen.cursor:=crhourglass;
     if Source <> '' then
     begin
        if FindFirst(Source + '\*.*',faDirectory+fahidden+fasysfile+faanyfile+faarchive+fareadonly, SearchRec)=0 then
        begin
          repeat
              application.ProcessMessages;
             if ((SearchRec.Attr = faDirectory and 255) or (SearchRec.Attr = 48)
                  or (SearchRec.Attr = 18) or (searchrec.attr=17) or (searchrec.attr=20))
                  and (pchar(SearchRec.Name) <> '.') and (pchar(SearchRec.Name) <> '..') then
                  begin
                      findfiles(Source + '\' + SearchRec.Name);
                  end else
                  begin
                      CopyFilewithprogressbar(PChar(Source+'\'+SearchRec.Name), PChar(networkpfad+ '\' + SearchRec.Name));
                  end;
application.ProcessMessages;
          until (FindNext(SearchRec) <> 0);
         FindClose(SearchRec);
        end;
    end;
  screen.cursor:=crdefault;
end;
Habe diese Prozedur schon in mehreren Programmen verwendet. Bisher ohne Probleme. Nun jedoch in meinem neusten Programm wird sie plötzlich nicht mehr akzeptiert. Die Fehlermeldung lautet: 323 Incompatible Types. Die Markierung bleibt auf :
if FindFirst(Source + '\*.*',faDirectory+fahidden+fasysfile+faanyfile+fa archive+fareadonly, SearchRec)=0
stehen. Irgendwie hat er plötzlich ein Problem mit "fareadonly" oder irgendwas da in der Nähe.

Was kann das sein? Ich habe keine blassen Schimmer was ihm nicht passt....
Ich verwenden Delphi 7 Enterprise.

Muetze1 15. Okt 2007 11:43

Re: Problem mit FindFirst
 
Naja, mal der Reihe nach:

1. Was soll
Delphi-Quellcode:
faDirectory+fahidden+fasysfile+faanyfile+faarchive+fareadonly
? Die Flags sind einzelne Bitkonstanten (einzige Ausnahme: faAnyFile, siehe folgendes) und definieren jeweils nur ein Bit und können von daher zufälligerweise addiert werden. Dieser Weg ist aber falsch - sie müssen mit ODER verknüpft werden. Auch steht die Konstante faAnyFile nicht für ein Bit sondern für mehrere gesetzte Bits und verramscht dir bei der Addition die kompletten anderen Bits. Und dazu noch, wo doch faAnyFile für alle anderen Bits steht.
Ergo: gebe nur faAnyFile an!

2. Was willst du mit der If Abfrage
Delphi-Quellcode:
if ((SearchRec.Attr = faDirectory and 255) or (SearchRec.Attr = 48)
                  or (SearchRec.Attr = 18) or (searchrec.attr=17) or (searchrec.attr=20))
                  and (pchar(SearchRec.Name) <> '.') and (pchar(SearchRec.Name) <> '..') then
erreichen? Vermutlich ob es ein Ordner ist und wenn ja, ob er ungleich . oder .. ist. Ok. Attr von TSearchRec ist auch eine Bitfeld wo jedes Bit seine Bedeutung hat, somit musst du eine logische Operation durchführen um zu testen ob ein Bit (das für Verzeichnis: faDirectory) gesetzt ist. Ergo:
Delphi-Quellcode:
if ( ( SearchRec.Attr and faDirectory ) = faDirectory ) then
3. Ich habe die Abfrage ob der Name ungleich . und .. ist extra rausgenommen, weil wenn es in deiner alten Abfrage dazu kam, dass es ein Verzeichnis ist und es den Namen . oder .. hatte, dann wurde dein ELSE Zweig aufgerufen und kopiert - war das so gewollt? Ich denke wohl eher nicht. Von daher füge die Namen Abfrage direkt vor dem rekursiven FindFiles() Aufruf an:
Delphi-Quellcode:
if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
Ich denke mal, dass sich das Problem mit den 3 Änderungen auch erledigt hat. Schon allein, da du das faReadOnly Flag gar nicht mehr brauchst.

toyoman 15. Okt 2007 13:10

Re: Problem mit FindFirst
 
Danke für deine Inputs. Warum ich da was genau so gemacht habe weiss ich im Detail nicht mehr. Diese Prozedur stammt aus "alten" Tagen. Hatte bestimmt alles seine Bedeutung und hat ja auch funktioniert.
Der neue Code sollte also deiner Meinung nach so aussehen?:

{Findet alle Dateien im SourcePfad und kopiert auf Networkpfad}
Delphi-Quellcode:
procedure findfiles(Source: string);
var SearchRec: TSearchRec;
begin
  screen.cursor:=crhourglass;
     if Source <> '' then
     begin
        if FindFirst(Source + '\*.*',faanyfile, SearchRec)=0 then
        begin
          repeat
              application.ProcessMessages;
              if ( ( SearchRec.Attr and faDirectory ) = faDirectory ) then
              begin
                    findfiles(Source + '\' + SearchRec.Name);
              end else
              begin
                    CopyFilewithprogressbar(PChar(Source+'\'+SearchRec.Name), PChar(networkpfad+ '\' + SearchRec.Name));
              end;
              application.ProcessMessages;
          until (FindNext(SearchRec) <> 0);
         FindClose(SearchRec);
        end;
    end;
  screen.cursor:=crdefault;
end;
Zitat:

Zitat von Muetze1
Naja, mal der Reihe nach:

1. Was soll
Delphi-Quellcode:
faDirectory+fahidden+fasysfile+faanyfile+faarchive+fareadonly
? Die Flags sind einzelne Bitkonstanten (einzige Ausnahme: faAnyFile, siehe folgendes) und definieren jeweils nur ein Bit und können von daher zufälligerweise addiert werden. Dieser Weg ist aber falsch - sie müssen mit ODER verknüpft werden. Auch steht die Konstante faAnyFile nicht für ein Bit sondern für mehrere gesetzte Bits und verramscht dir bei der Addition die kompletten anderen Bits. Und dazu noch, wo doch faAnyFile für alle anderen Bits steht.
Ergo: gebe nur faAnyFile an!

2. Was willst du mit der If Abfrage
Delphi-Quellcode:
if ((SearchRec.Attr = faDirectory and 255) or (SearchRec.Attr = 48)
                  or (SearchRec.Attr = 18) or (searchrec.attr=17) or (searchrec.attr=20))
                  and (pchar(SearchRec.Name) <> '.') and (pchar(SearchRec.Name) <> '..') then
erreichen? Vermutlich ob es ein Ordner ist und wenn ja, ob er ungleich . oder .. ist. Ok. Attr von TSearchRec ist auch eine Bitfeld wo jedes Bit seine Bedeutung hat, somit musst du eine logische Operation durchführen um zu testen ob ein Bit (das für Verzeichnis: faDirectory) gesetzt ist. Ergo:
Delphi-Quellcode:
if ( ( SearchRec.Attr and faDirectory ) = faDirectory ) then
3. Ich habe die Abfrage ob der Name ungleich . und .. ist extra rausgenommen, weil wenn es in deiner alten Abfrage dazu kam, dass es ein Verzeichnis ist und es den Namen . oder .. hatte, dann wurde dein ELSE Zweig aufgerufen und kopiert - war das so gewollt? Ich denke wohl eher nicht. Von daher füge die Namen Abfrage direkt vor dem rekursiven FindFiles() Aufruf an:
Delphi-Quellcode:
if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
Ich denke mal, dass sich das Problem mit den 3 Änderungen auch erledigt hat. Schon allein, da du das faReadOnly Flag gar nicht mehr brauchst.


DeddyH 15. Okt 2007 13:41

Re: Problem mit FindFirst
 
IMO sollte die Abfrage auf '.' und '..' schon mit rein, aber an die richtige Stelle ;)
Delphi-Quellcode:
procedure findfiles(Source: string);
var SearchRec: TSearchRec;
begin
  screen.cursor:=crhourglass;
     if Source <> '' then
     begin
        if FindFirst(Source + '\*.*',faanyfile, SearchRec)=0 then
        begin
          repeat
              application.ProcessMessages;
              if ( ( SearchRec.Attr and faDirectory ) = faDirectory ) then
              begin
                    if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
                     findfiles(Source + '\' + SearchRec.Name);
              end else
              begin
                    CopyFilewithprogressbar(PChar(Source+'\'+SearchRec.Name), PChar(networkpfad+ '\' + SearchRec.Name));
              end;
              application.ProcessMessages;
          until (FindNext(SearchRec) <> 0);
         FindClose(SearchRec);
        end;
    end;
  screen.cursor:=crdefault;
end;

toyoman 15. Okt 2007 15:22

Re: Problem mit FindFirst
 
Besten Dank für die Info!

Zitat:

Zitat von DeddyH
IMO sollte die Abfrage auf '.' und '..' schon mit rein, aber an die richtige Stelle ;)
Delphi-Quellcode:
procedure findfiles(Source: string);
var SearchRec: TSearchRec;
begin
  screen.cursor:=crhourglass;
     if Source <> '' then
     begin
        if FindFirst(Source + '\*.*',faanyfile, SearchRec)=0 then
        begin
          repeat
              application.ProcessMessages;
              if ( ( SearchRec.Attr and faDirectory ) = faDirectory ) then
              begin
                    if (SearchRec.Name <> '.') and (SearchRec.Name <> '..') then
                     findfiles(Source + '\' + SearchRec.Name);
              end else
              begin
                    CopyFilewithprogressbar(PChar(Source+'\'+SearchRec.Name), PChar(networkpfad+ '\' + SearchRec.Name));
              end;
              application.ProcessMessages;
          until (FindNext(SearchRec) <> 0);
         FindClose(SearchRec);
        end;
    end;
  screen.cursor:=crdefault;
end;


Muetze1 15. Okt 2007 18:51

Re: Problem mit FindFirst
 
Jo, genau so wie DeddyH gezeigt hat und du übernommen hast. Ich hoffe die Erklärungen waren verständlich warum so und nicht anders herum. Ansonsten sollte aber wie geschrieben, der Ausgangsfehler auch weg sein.

toyoman 15. Okt 2007 19:35

Re: Problem mit FindFirst
 
jo war sehr wohl verständlich.
vielen dank!

Zitat:

Zitat von Muetze1
Jo, genau so wie DeddyH gezeigt hat und du übernommen hast. Ich hoffe die Erklärungen waren verständlich warum so und nicht anders herum. Ansonsten sollte aber wie geschrieben, der Ausgangsfehler auch weg sein.



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