![]() |
Seltsamkeit bei FindFirst, FindNext
Warum findet folgender Code auch Dateien, nicht nur Verzeichnisse?
Delphi-Quellcode:
Dank von Frank
var i:integer; attribs:tSearchRecord; pfad:string;
begin // anderer Code i:=findfirst(pfad,$10,attribs); // Verzeichnisse suchen while (i=0) and (fm.aTest.tag=1) do begin // fm.aTest.tag=0 bedeutet Abbruch if ((attribs.name<>'.') and (attribs.name<>'..')) then begin application.processMessages; slDirDirs.Add(pfad+attribs.Name+'\'); inc(cDirs); // Verzeichnis in StringList speichern end; i:=findnext(attribs) end; findclose(attribs); |
Re: Seltsamkeit bei FindFirst, FindNext
Probiers mal so:
Delphi-Quellcode:
Wie du darauf kommst die $10 zu verwenden, will ich erst gar nicht wissen, es ist üblich die vordefinierten Konstanten zu verwenden.
var i:integer; attribs:tSearchRecord; pfad:string;
begin // anderer Code i:=findfirst(pfad,faAnyFile,attribs); // Verzeichnisse suchen while (i=0) and (fm.aTest.tag=1) do begin // fm.aTest.tag=0 bedeutet Abbruch if ((attribs.name<>'.') and (attribs.name<>'..') and ((attribs.attr and faDirectory) <> 0)) then begin application.processMessages; slDirDirs.Add(pfad+attribs.Name+'\'); inc(cDirs); // Verzeichnis in StringList speichern end; i:=findnext(attribs) end; findclose(attribs); Desweiteren werden erst alle Dateien (faAnyFile) gefunden und nur wenn faDirectory in den Attributen vorkommt wird die Datei hinzugefügt. |
Re: Seltsamkeit bei FindFirst, FindNext
Zitat:
Zitat:
|
Re: Seltsamkeit bei FindFirst, FindNext
Zuerst hatte ichs ja so, daß das gesamte Verzeichnis eingelesen wird und dann über AND abgefragt wurde. Aber inzwischen ist die Sache komplexer geworden, weshalb ich zuerst alle Dateien und dann alle Verzeichnisse brauche. Und um Bearbeitungszeit zu sparen, lasse ich gleich getrennt nach den Attributen suchen.
Aber mittlerweile hat sich der Fehler verflüchtigt. Ich habe keine Ahnung, was ich dran geändert habe. Habe ewig irgendwelche klitzekleinen Änderungen probiert und zuletzt die Attribute der gefundenen Dateien showmessagen lassen. Jetzt ist es so wie vorher und es geht auf einmal wieder. Das mit der Konstante.. bin halt e Bissl schreibfaul. :roll: Und besteht denn die Möglichkeit, daß sich die $10 für Directories in absehbarer Zeit ändern wird? |
Re: Seltsamkeit bei FindFirst, FindNext
*Heuel* Er macht es doch noch! Lediglich in meinem kleinen Testdir gings.
Er sucht nicht nur nach Directories ($10) sondern gibt auch Dateien zurück, die das Archivbit gesetzt haben. Und das Tollste: ich habe zum Test bei einer das Archivbit gelöscht und jetzt fügt er sie an mit einem Attributwert von 128!!! Der ist gar nicht dokumentiert. :?: |
Re: Seltsamkeit bei FindFirst, FindNext
Zitat:
|
Re: Seltsamkeit bei FindFirst, FindNext
Das Prog benennt Dateien um. Man kann auswählen, ob man Dateien, Verzeichnisse oder beide auf einmal bearbeiten lassen will. Außerdem geht das ganze auch in die Verzeichnisse rein.
Folgende ist die rekursive Suchprozedur, eingebettet in die "Suchinterface-Prozedur". Variablen, die hier nicht deklariert sind, stehen in der übergeordneten.
Delphi-Quellcode:
Das Problem ist jetzt, daß die Suche nach Verzeichnissen auch Dateien mit anfügt, obwohl ich nur nach Verzeichnissen suchen lasse (besagtes $10). Zur Laufzeit eindeutig daran zu erkennen, daß in der Liste hinter einem Dateinamen ein \ angefügt ist. Also Statt "Datei.txt" kommt dann "Datei.txt\". Und wenn ich auch nach Dateien suche, dann steht demzufolge einmal "Datei.txt" drin UND noch "Datei.txt\".
procedure suche(pfad:string);
var slDirDirs:tStringList; c:integer; begin slDirFiles.clear; slDirDirs:=tStringList.create; if filenames then begin // Dateien sollen gesucht werden i:=findfirst(pfad+fm.egMaske.text,$67,attribs); // Dateien suchen while (i=0) and (fm.aTest.tag=1) do begin // aTest.tag=0 ist Abbruch (Button gedrückt) application.processMessages; slDirFiles.Add(pfad+attribs.name); // sl* sind Stringlists inc(cFiles); // Zählvari für spätere Statistik i:=findnext(attribs) end; if fm.cbSorted.Checked then slDirFiles.Sort // ggf. sortieren, wenn angekreuzt end; findclose(attribs); // Und das ganze nochmal für Verzeichnisse // Habe schon probeweise den oberen Teil rausgenommen, half aber nichts i:=findfirst(pfad+fm.egMaske.text,$10,attribs); // Verzeichnisse suchen while (i=0) and (fm.aTest.tag=1) do begin if ((attribs.name<>'.') and (attribs.name<>'..')) then begin application.processMessages; slDirDirs.Add(pfad+attribs.Name+'\'); // der \ markiert den Pfad in der Liste als Verzeichnis end; i:=findnext(attribs) end; findclose(attribs); if fm.cbSorted.Checked then slDirDirs.Sort; slDateien.AddStrings(slDirFiles); // Dateien in die globale Liste übernehmen if Recurse then for c:=0 to slDirDirs.count-1 do suche(slDirDirs[c]); // Rekursiv in Unterverzeichnisse gehen if dirNames then begin // Verzeichnisse in die Liste aufnehmen? slDateien.addStrings(slDirDirs); // dann auch deren Namen in die globale Liste schreiben inc(cDirs,slDirDirs.count) end; slDirDirs.free end; So, ich fahr jetzt erstmal nach Hause. Schüss |
Re: Seltsamkeit bei FindFirst, FindNext
Zitat:
|
Re: Seltsamkeit bei FindFirst, FindNext
Ich glaube irgendwo mal gelesen zu haben, dass Borlands Implementierung von FindFirst und FindNext fehlerhaft ist und diese immer auch Dateien zurückliefert, auch wenn man faDirectory verwendet.
mfG mirage228 |
Re: Seltsamkeit bei FindFirst, FindNext
Ich verstehe nicht warum du darauf beharrst, das Attribut schon bei FindFirst() angibst.
Wenn du doch sowieso schon zwei Stringlisten hast und nach Verzeichnissen und Dateien suchst, dann pack doch alles in eine Suche. @MathiasSimmack Du hast recht mit deiner Vermutung, ich weis das $10 faDirectory ist, mich irritierte nur die Schreibweise. Apropos: Was $67 sein soll weis ich allerdings nicht :-)
Delphi-Quellcode:
i:=findfirst(pfad+fm.egMaske.text,faAnyFile,attribs); // Dateien suchen
while (i=0) and (fm.aTest.tag=1) do begin // aTest.tag=0 ist Abbruch (Button gedrückt) application.processMessages; If ((attribs.attr and faDirectory) <> 0) then begin if ((attribs.name<>'.') and (attribs.name<>'..')) then begin application.processMessages; slDirDirs.Add(pfad+attribs.Name+'\'); // der \ markiert den Pfad in der Liste als Verzeichnis end; end else if filenames then // Dateien sollen gesucht werden begin slDirFiles.Add(pfad+attribs.name); // sl* sind Stringlists inc(cFiles); // Zählvari für spätere Statistik end; i:=findnext(attribs) end; if fm.cbSorted.Checked then slDirFiles.Sort // ggf. sortieren, wenn angekreuzt findclose(attribs); if fm.cbSorted.Checked then slDirDirs.Sort; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:20 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