![]() |
FindFirst/FindNext BUG
Liste der Anhänge anzeigen (Anzahl: 2)
Der folgende Code findet auf meinen Platten nicht alle Dateien.
Auf meiner "G"-Festplatte findet er alles einwandfrei, aber z.B. auf meiner "F"-Festplatte fidet er nichts.
Delphi-Quellcode:
Beim Debuggen der Funktion ist mir aufgefallen das FindFirst für fsr.Attr = 8208 zurückliefert.
procedure TForm1.ReadDir(path : string; sl : TStrings);
var Fsr : TSearchRec; FFileAttrs: Integer; FName : string; begin path := IncludeTrailingPathDelimiter(path); FFileAttrs := faAnyFile; if FindFirst(Path + '*.*', FFileAttrs, Fsr) = 0 then begin repeat if (fsr.Attr and faDirectory) = fsr.Attr then begin if copy(fsr.name,1,1) <> '.' then ReadDir(Path+fsr.name, sl); end else if (fsr.Attr and FFileAttrs) = fsr.Attr then begin if copy(fsr.Name,1,1) <> '.' then begin FName := path+fsr.Name; sl.add(FName); end; end; until FindNext(fsr) <> 0; FindClose(fsr); end; end; Kann das mal jemand überprüfen ? PS : Win XP-Pro SP2 Delphi 2005 [eng] Architect Trail [edit=sakura] D2005 aus dem Titel entfernt. Mfg, sakura[/edit] |
Re: [D2005] FindFirst/FindNext BUG
Zitat:
|
Re: [D2005] FindFirst/FindNext BUG
Keine Ahnung von einen Bug aber mit dem was ich mir gebastelt habe funktioniert jedes Laufwerk.
Code:
Damit habe ich noch nie problemme gehapt.
procedure THaupt.SEARCH_DIR(Dir, Filter : string; var List : TStringList);
var SEARCH: TSearchRec; RES: integer; begin Application.ProcessMessages; RES := findfirst(Dir+'\'+Filter,faanyfile-faDirectory,SEARCH); try while RES = 0 do begin if (SEARCH.Attr and faDirectory) = 0 then begin List.Add(Dir + '\' + SEARCH.Name); Application.ProcessMessages; end; RES := findnext(SEARCH); end; finally findclose(SEARCH); end; RES := findfirst(Dir+'\'+'*.*',faanyfile,SEARCH); try while RES = 0 do begin if (SEARCH.Name <> '.') and (SEARCH.Name <> '..') and ((SEARCH.Attr and faDirectory) <> 0) then SEARCH_DIR(Dir+'\'+SEARCH.Name, Filter, List); RES := findnext(SEARCH); end; finally findclose(SEARCH); end; end; gsh |
Re: [D2005] FindFirst/FindNext BUG
Ich bin selber verwirrt, aber ich hab schon alle Platten per ScanDisk überprüft.
Nur bei "G" funktioniert es. |
Re: [D2005] FindFirst/FindNext BUG
@Nightshade: Hast du deinen Code auch mal unter Delphi 7 getestet? Ist es dort genauso?
|
Re: [D2005] FindFirst/FindNext BUG
Zitat:
Nein unter D7 geht es auch nicht.... Aber woher kommt dieses Atrr = 8208 ? |
Re: [D2005] FindFirst/FindNext BUG
Zitat:
mit
Code:
kommst du sicherlich auch auf Laufwerk G: ;)
ChDir('G:\')
|
Re: [D2005] FindFirst/FindNext BUG
Das Problem ist folgendes:
Delphi-Quellcode:
Richtig muss es heissen:
if (fsr.Attr and faDirectory) = fsr.Attr then
Delphi-Quellcode:
Seit wann muss man ein ChDir machen, um Dateien auf einem anderen Laufwerk zu suchen?
if (fsr.Attr and faDirectory) = faDirectory then
Und deine Variante mit zwei Schleifen ist auch nicht gerade performant. Das kannst du doch alles in einer machen. |
DP-Maintenance
Dieses Thema wurde von "sakura" von "Delphi 2005 - Bugreports" nach "Windows API" verschoben.
Kein Bug in Delphi, sondern beim Programmierer :mrgreen: |
Re: [D2005] FindFirst/FindNext BUG
@jim_raynor: Ich habe eigentlich in Erinnerung das das genau so wie bei FindFirstFile() ist...
Ja da bin ich mir sogar fast Sicher :)... |
Re: FindFirst/FindNext BUG
Moin!
Jo, so wie Jim_Raynor das auch richtig schreibt ist es auch bei FindFirstFile(). Das ist eindeutig der Fehler in deinem Code, da die einzelnen Flags nur Bits in den Attributen sind und du sie eigentlich ausmaskierst und dann schaust ob sie gesetzt sind. Du hast diese ausmaskiert und geschaut ob sich nix geändert hat, was dann bedeutet, das das jeweilige Bit nicht gesetzt ist. Somit rufst du eine Unterdirectorysuche auf ohne das du ein Directory vor dir hast. MfG Muetze1 |
Re: FindFirst/FindNext BUG
Moin Nightshade,
noch ein Bug in Deiner Routine:
Delphi-Quellcode:
es muss explizit auf <> '.' und <> '..' geprüft werden, da eine Datei/Verzeichnisname durchaus mit einem Punkt beginnen darf.
if copy(fsr.name,1,1) <> '.' then
|
Re: FindFirst/FindNext BUG
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:44 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