Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Seltsamkeit bei FindFirst, FindNext (https://www.delphipraxis.net/12886-seltsamkeit-bei-findfirst-findnext.html)

Thunderchild 5. Dez 2003 17:08


Seltsamkeit bei FindFirst, FindNext
 
Warum findet folgender Code auch Dateien, nicht nur Verzeichnisse?
Delphi-Quellcode:
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);
Dank von Frank

scp 5. Dez 2003 17:37

Re: Seltsamkeit bei FindFirst, FindNext
 
Probiers mal so:
Delphi-Quellcode:
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);
Wie du darauf kommst die $10 zu verwenden, will ich erst gar nicht wissen, es ist üblich die vordefinierten Konstanten zu verwenden.
Desweiteren werden erst alle Dateien (faAnyFile) gefunden und nur wenn faDirectory in den Attributen vorkommt wird die Datei hinzugefügt.

choose 5. Dez 2003 17:50

Re: Seltsamkeit bei FindFirst, FindNext
 
Zitat:

Zitat von scp
[...] Wie du darauf kommst die $10 zu verwenden, will ich erst gar nicht wissen [...]

und
Zitat:

Zitat von OH
Code:
Konstante   Wert Beschreibung
faReadOnly     1  Schreibgeschützte Datei
[...]
faDirectory   16  Verzeichnisdatei

Es gilt somit faDirectory=16=$10.

Thunderchild 5. Dez 2003 18:01

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?

Thunderchild 5. Dez 2003 18:28

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. :?:

scp 5. Dez 2003 19:20

Re: Seltsamkeit bei FindFirst, FindNext
 
Zitat:

Zitat von Thunderchild
*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. :?:

Was meinst du damit, dass er sie anfügt? und wie löschst du das Bit? Poste am besten mal die betreffenden Codeschnipsel.

Thunderchild 5. Dez 2003 19:42

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:
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;
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\".


So, ich fahr jetzt erstmal nach Hause. Schüss

MathiasSimmack 5. Dez 2003 20:41

Re: Seltsamkeit bei FindFirst, FindNext
 
Zitat:

Zitat von choose
Zitat:

Zitat von scp
[...] Wie du darauf kommst die $10 zu verwenden, will ich erst gar nicht wissen [...]

und
Zitat:

Zitat von OH
Code:
Konstante   Wert Beschreibung
faReadOnly     1  Schreibgeschützte Datei
[...]
faDirectory   16  Verzeichnisdatei

Es gilt somit faDirectory=16=$10.

Rein technisch ist an deiner Antwort nichts auszusetzen. Allerdings denke ich, die Frage bezog sich mehr auf das Warum. Sicher wird auch scp (mit oder ohne Blick in die Hilfe) wissen, wie der Wert $10 zustande kommt. Aber, und das ist der Punkt, man wird in 90% der Fälle erst mal nachgucken müssen. Das kann dir bei faDirectory nicht passieren.

mirage228 5. Dez 2003 20:56

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

scp 5. Dez 2003 21:45

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.
Seite 1 von 2  1 2      

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