AGB  ·  Datenschutz  ·  Impressum  







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

FindFirst, FindNext

Ein Thema von nailor · begonnen am 6. Jan 2003 · letzter Beitrag vom 12. Jan 2003
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#1

FindFirst, FindNext

  Alt 6. Jan 2003, 23:19
Delphi-Quellcode:
FindFirst('*.*', faanyfile, dat);
FindNext('*.*', faanyfile, dat);
FindNext('*.*', faanyfile, dat);
gibt auch 'blabla' zurück, obwohl in blabla kein Punlt drin ist. Warum???

und wie kann man nur nach Dateien suchen (Ordner ausschließen)?

---

Nochwas:

Delphi-Quellcode:
SetCurrentDir('c\:')
FindFirst('*.*', c, dat);
FindNext(dat);
liefert '..' zurück. Das gibt es doch aber gar nicht?!?!
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#2

Re: FindFirst, FindNext

  Alt 6. Jan 2003, 23:41
Zitat von Nailor:
SetCurrentDir('c\:')
Schonmal mit "Zäh Doppelpunkt Backslash" versucht?

Grüsse, Daniel
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 7. Jan 2003, 01:01
Moin Nailor,

die Suchmaske *.* bedeutet:
Suche nach allen Dateinamen (erster *) und allen Endungen (.*)
Anders formuliert: Suche nach allem.
Logisch, dass dann auch alles zurückgeliefert wird.

Die Suche nur nach Dateien sollte so gehen

FindFirst('*.*',faAnyFile and not faDirectory,dat) Schau Dir dazu mal am besten die möglichen Werte für faXXXX in der Hilfe an. Wichtig: Bei solchen Werten (Flags) immer mit or zusammenfügen und mit and not löschen niemals mit +/-. Das würde zwar meist gutgehen, muss es aber nicht, da diese Konstanten Bitmuster enthalten und somit auch, wenn man es nicht erwartet, einen negativen Wert enthalten können, so dass aus der Subtraktion unerwartet eine Addtion wird. Kann interessante Probleme zur Folge haben.

Ich für meinen Teil suche immer erst mal nach allem (faAnyFile) und filtere dann hinterher (z.B. if (dat.Attr and faDirectory) = 0 then, wenn ich Directories herausfiltern will), da ich den FindFirst Filtern bei der Abfrage nicht so recht traue
Ist aber bestimmt Geschmackssache.

Den Eintrag .. gibt es durch aus. Ebenso auch den Eintrag .
Nach diesem beiden wird man immer Filtern müssen, denn sie werden wohl auch immer auftauchen (zumindest bei *.*)

Mit .. kann man zum übergeordneten Verzeichnis verzweigen, mit . ist das aktuelle Verzeichnis gemeint.
Mach am besten mal eine Konsole auf und lass Dir mal mit DIR den Verzeichnis inhalt anzeigen.
Dabei werden . und .. auch angezeigt (als erstes)
Ein leeres Verzeichnis enthält dann auch nur diese beiden.

Wenn Du in einem Unterverzeichnis mal Dir .. eingibst erhältst Du den Inhalt des übergeorneten Verzeichnisses, mit Dir . das gleiche wie mit Dir und Dir *.*.

Die Abfrage müsste also lauten:
Delphi-Quellcode:
if (dat.name <> '.') and (dat.name <> '..') then
begin
  // Mach was mit dem gefundenen Namen
end;
Ach ja:
Nicht mit dat.name[1] <> '.' abfragen.
Punkte sind in Datei und Verzeichnisnamen zugelassen, auch als erstes Zeichen, und somit können einem Dateien/Verzeichnisse entgehen.

Nachtrag:
Du kannst bei FindFirst auch einen kompletten Startpfad für die Suche angeben, und brauchst diesen nicht mit SetCurrentDirectory zu setzen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von eddy
eddy

Registriert seit: 4. Jan 2003
Ort: Sachsen
573 Beiträge
 
Delphi 5 Professional
 
#4

Ergänzung zu FindFirst

  Alt 7. Jan 2003, 01:55
Hallo Nailor,

'C\:' kann jeden in den Wahnsinn treiben!!

Der Vollständigkeit halber sollte am Ende noch "FindClose" stehen.

Delphi-Quellcode:
procedure TForm1.MyNameClick(Sender: TObject);
var
  srec : TSearchRec;
begin
  ....
  if FindFirst('C:\Pfad\*.*', faAnyFile, srec) = 0 then begin
    repeat
      ....
      // jedemenge Befehle
      ....
    until FindNext(srec) <> 0;
  end;
  FindClose(srec);
  ....
end;

mfg
eddy
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 7. Jan 2003, 02:06
Moin eddy,

wenn Du es ganz vollständig haben willst

Delphi-Quellcode:
procedure TForm1.MyNameClick(Sender: TObject);
var
  srec : TSearchRec;
begin
  ....
  if FindFirst('C:\Pfad\*.*', faAnyFile, srec) = 0 then begin
    try
      repeat
        ....
        // jedemenge Befehle
        ....
      until FindNext(srec) <> 0;
    finally
      FindClose(srec);
    end;
  end;
  ....
end;
try/finally (Resourcenschutzblock) um sicherzustellen, dass die durch den erfolgreichen Aufrufe von FindFirst belegten Resourcen auch wieder freigegeben werden.
Das FindClose hab' ich etwas nach oben gerückt, da es ja nur bei erfolgreichem Aufruf von FindFirst notwendig ist.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#6
  Alt 7. Jan 2003, 02:18
Thx, waren ein paar gute Tipps dabei, und sorry für die Mühe mit dem Typo bei C-Doppelpunkt-Backslash bzw. C-Backslash-Doppelpunkt. Hab mich echt vertan

Aber trotzdem:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var dat: tsearchrec;
begin
SetCurrentDir('c:\');
FindFirst('*.*', faanyfile, dat);
Caption := dat.name;
end;
Lifert im Gegensatz zu jedem andern Verzweichnis nicht '.' zurück. Obwohl doch auch im Hauptverzeichnis das aktuelle Verzeichnis mit '.' bezeichnet sein müsste...
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 7. Jan 2003, 02:27
Moin Nailor,

stimmt, und auch kein ..
Ich werde mir das nochmal auf einem 9x und, nach Möglichkeit NT 4 Rechner ansehen, da ich mir sicher bin, dass ich diese beiden Angaben auch schon im Root gesehen habe.

BTW: Du hast das FindClose vergessen
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#8
  Alt 7. Jan 2003, 02:34
Ein '..' wäre ja auch falsch weils das nicht gibt. Aber ein '.' gibt es ja. Aber Delphi will es nicht finden.

FineClose lohnt sich bei so Hammer-Testprogrammen mit nur einem Button und 3 Zeilen Code, die noch nichteinmal gespeichrt werden nicht

Delphi gibt doch die verwendeten Resourcen beim Beenden eh frei, oder nicht?
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 7. Jan 2003, 02:44
Moin Nailor,

sicher, dass ist bei einem solchen Test nicht zwingend notwendig, aber ich finde je mehr es einem "in Fleisch und Blut" übergeht so etwas mit zu schreiben, umso geringer ist die Gefahr es zu vergessen wenn es notwendig ist.

Gerade, dass ich in einem Root Verzeichnis mal ein .. gesehen habe hatte mich so verblüfft, da es das, wie Du ja schon so richtig sagst, eigentlich nicht geben kann.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von nailor
nailor

Registriert seit: 12. Dez 2002
Ort: Karlsruhe
1.989 Beiträge
 
#10
  Alt 8. Jan 2003, 12:15
Was mach ich jetzt schon wieder falsch?

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  a: TSearchRec;
begin
ListBox1.Clear;
SetCurrentDir('C:\');

FindFirst('*.*', faDirectory , a);
ListBox1.Items.Append(a.Name);
while FindNext(a) = 0 do
  ListBox1.Items.Append(a.name);
FindClose(a);

ListBox1.Items.Append('');
ListBox1.Items.Append(stringofchar('#', 75));
ListBox1.Items.Append('');

if FindFirst('*.*', faAnyFile and not faDirectory, a) = 0 then
  begin
    ListBox1.Items.Append(a.Name);
    while FindNext(a) = 0 do
      ListBox1.Items.Append(a.name);
  end
else
  ListBox1.Items.Append('no files found');
FindClose(a);
end;
Das Obere zeigt alle Ordner und alle Dateien an...

PS: Die Delphi-Hilfe:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var
  sr: TSearchRec;
  FileAttrs: Integer;
begin
  StringGrid1.RowCount := 1;
  if CheckBox1.Checked then
    FileAttrs := faReadOnly
  else
    FileAttrs := 0;
  if CheckBox2.Checked then
    FileAttrs := FileAttrs + faHidden;
  if CheckBox3.Checked then
    FileAttrs := FileAttrs + faSysFile;
  if CheckBox4.Checked then
    FileAttrs := FileAttrs + faVolumeID;
  if CheckBox5.Checked then

    FileAttrs := FileAttrs + faDirectory;
  if CheckBox6.Checked then
    FileAttrs := FileAttrs + faArchive;
  if CheckBox7.Checked then

    FileAttrs := FileAttrs + faAnyFile;

  with StringGrid1 do
  begin
    RowCount := 0;

    if FindFirst(Edit1.Text, FileAttrs, sr) = 0 then

    begin
      repeat
        if (sr.Attr and FileAttrs) = sr.Attr then
        begin
        RowCount := RowCount + 1;
        Cells[1,RowCount-1] := sr.Name;
        Cells[2,RowCount-1] := IntToStr(sr.Size);
        end;
      until FindNext(sr) <> 0;
      FindClose(sr);
    end;
  end;
end;
arbeitet auch ohne and/and not. Nur zum Testen von gesetzten Werten:

To test for an attribute, combine the value of the Attr field with the attribute constant with the and operator. If the file has that attribute, the result will be greater than 0. For example, if the found file is a hidden file, the following expression will evaluate to True: (SearchRec.Attr and faHidden) <> 0.
Michael N.
http://nailor.devzero.de/code/sharpmath/testing/ --- Tests, Feedback, Anregungen, ... aller Art sehr willkommen!
::: don't try so hard - it'll happen for a reason :::
  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 02:59 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