AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Seltsamkeit bei FindFirst, FindNext

Ein Thema von Thunderchild · begonnen am 5. Dez 2003 · letzter Beitrag vom 6. Dez 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Thunderchild
Thunderchild

Registriert seit: 12. Nov 2003
Ort: Nohra
139 Beiträge
 
Delphi 7 Personal
 
#1

Seltsamkeit bei FindFirst, FindNext

  Alt 5. Dez 2003, 18:08
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
Das letzte Schöne, das in C geschrieben wurde, war Schuberts 9. Sinfonie.
Meine Softwareseite (Link aktualisiert am 13.12.2006).
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#2

Re: Seltsamkeit bei FindFirst, FindNext

  Alt 5. Dez 2003, 18:37
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.
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#3

Re: Seltsamkeit bei FindFirst, FindNext

  Alt 5. Dez 2003, 18:50
Zitat von scp:
[...] Wie du darauf kommst die $10 zu verwenden, will ich erst gar nicht wissen [...]
und
Zitat von OH:
Code:
Konstante   Wert Beschreibung
faReadOnly     1  Schreibgeschützte Datei
[...]
faDirectory   16  Verzeichnisdatei
Es gilt somit faDirectory=16=$10.
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von Thunderchild
Thunderchild

Registriert seit: 12. Nov 2003
Ort: Nohra
139 Beiträge
 
Delphi 7 Personal
 
#4

Re: Seltsamkeit bei FindFirst, FindNext

  Alt 5. Dez 2003, 19:01
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. Und besteht denn die Möglichkeit, daß sich die $10 für Directories in absehbarer Zeit ändern wird?
Das letzte Schöne, das in C geschrieben wurde, war Schuberts 9. Sinfonie.
Meine Softwareseite (Link aktualisiert am 13.12.2006).
  Mit Zitat antworten Zitat
Benutzerbild von Thunderchild
Thunderchild

Registriert seit: 12. Nov 2003
Ort: Nohra
139 Beiträge
 
Delphi 7 Personal
 
#5

Re: Seltsamkeit bei FindFirst, FindNext

  Alt 5. Dez 2003, 19:28
*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.
Das letzte Schöne, das in C geschrieben wurde, war Schuberts 9. Sinfonie.
Meine Softwareseite (Link aktualisiert am 13.12.2006).
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#6

Re: Seltsamkeit bei FindFirst, FindNext

  Alt 5. Dez 2003, 20:20
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.
  Mit Zitat antworten Zitat
Benutzerbild von Thunderchild
Thunderchild

Registriert seit: 12. Nov 2003
Ort: Nohra
139 Beiträge
 
Delphi 7 Personal
 
#7

Re: Seltsamkeit bei FindFirst, FindNext

  Alt 5. Dez 2003, 20:42
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
Das letzte Schöne, das in C geschrieben wurde, war Schuberts 9. Sinfonie.
Meine Softwareseite (Link aktualisiert am 13.12.2006).
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#8

Re: Seltsamkeit bei FindFirst, FindNext

  Alt 5. Dez 2003, 21:41
Zitat von choose:
Zitat von scp:
[...] Wie du darauf kommst die $10 zu verwenden, will ich erst gar nicht wissen [...]
und
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.
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Seltsamkeit bei FindFirst, FindNext

  Alt 5. Dez 2003, 21:56
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
David F.
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#10

Re: Seltsamkeit bei FindFirst, FindNext

  Alt 5. Dez 2003, 22:45
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz