AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Findfirst...Findnext funktioniert nicht 100%ig
Thema durchsuchen
Ansicht
Themen-Optionen

Findfirst...Findnext funktioniert nicht 100%ig

Ein Thema von scrat1979 · begonnen am 8. Mär 2007 · letzter Beitrag vom 8. Mär 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#1

Findfirst...Findnext funktioniert nicht 100%ig

  Alt 8. Mär 2007, 07:41
Ich habe ein Problem mit einer Komponente, die ich im Moment schreibe. Keine Angst, es handelt sich um ein "Object-Pascal" - PRoblem.

Die Komponente macht im Prinzip nichts anderes wie alle Dateien in einem Verzeichnis aufzulisten, wobei auch Unterverzeichnisse mitberücksichtigt werden. Nun das Problem: Die PRozedur arbeitet perfekt, bis auf eine Kleinigkeit: Stellt man z.B. Mask auf '*.pas' funktioniert die Prozedur nur. wenn im ersten Verzeichnis auch mind. eine .pas-Datei vorhanden ist ( Da ja nur dann FindFirst = 0 ist ). Hat mir jemand evtl. ein Workaround dafür??

Danke im Voraus,

SCRaT

Delphi-Quellcode:
procedure TMyFileSearch.DoSearch(InitDir : String);
var SR : TSearchRec;
     S : String;
begin
 if FindFirst(InitDir + FMask, faAnyFile, sr) = 0 then
    begin
      repeat
        // '.' und '..' nicht beachten
        if (SR.Name <> '.') and (SR.Name <> '..') then Begin;
          // Wenn kein Verzeichnis
          if (SR.Attr and faDirectory) = 0 then Begin
            IF FFullPath Then FFileList.Add(InitDir + SR.Name)
                         Else FFileLIst.Add(SR.Name);
          end else begin
            // Wenn Verzeichnis
            IF FFullpath Then S := InitDir + SR.Name
                         Else S := SR.Name;

            if FMarkDirs then S := '[' + S + ']';

            IF FShowDirs Then FFileList.Add(S);
            if FSubDirs Then DoSearch(InitDir + SR.Name + '\');
          end;
        End;
      until FindNext(sr) <> 0;
      FindClose(sr);
 end;
End;
EDIT: Statt "IF FindFirst..." nur "FindFirst..." zu schreiben funktioniert leider nicht
Michael Kübler
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Findfirst...Findnext funktioniert nicht 100%ig

  Alt 8. Mär 2007, 07:47
Guten Morgen,

schau Dir bitte einmal diesen Thread aus der CodeLib an, rekursiv heißt da der Ansatz.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Findfirst...Findnext funktioniert nicht 100%ig

  Alt 8. Mär 2007, 07:58
Dankeschön, aber genau das ist das Problem. Mein Prinzip ist ja dasselbe. Übrigens wird ja auch bei mir schon rekursiv gesucht

Delphi-Quellcode:
[...]
     if FSubDirs Then DoSearch(InitDir + SR.Name + '\');
[...]
Das Hauptproblem ist nur, dass die Prozedur erst gar nicht durchlaufen wird, wenn eine entsprechende DAtei im STARTVERZEICHNIS nicht gefunden wurde.

Beispiel 1: Suchstart in D:\TEST mit Mask = '*.INI'

D:\TEST\TEST1.TXT
D:\TEST\TEST2.TXT
D:\TEST\TEST1.INI <--
D:\TEST\MYFILE.DAT
D:\TEST\TESTDIR\CONFIG.INI <--

dies funktioniert, da im Startverzeichnis eine .INI-DAtei vorhanden ist.

Beispiel 1: Suchstart in D:\TEST mit Mask = '*.INI'

D:\TEST\TEST1.TXT
D:\TEST\TEST2.TXT
D:\TEST\MYFILE.DAT
D:\TEST\TESTDIR\CONFIG.INI <-- wird nicht gefunden

dies funktioniert NICHT, da im Startverzeichnis KEINE .INI-DAtei vorhanden ist. Somit kommt die Prozedur erst gar nicht an den Punkt um die Verzeichnisse rekursiv aufzurufen.

SCRaT
Michael Kübler
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Findfirst...Findnext funktioniert nicht 100%ig

  Alt 8. Mär 2007, 08:15
Delphi-Quellcode:
  if Recurse then
    if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then //<-- geht durch den Verzeichnisbaum
    try
      repeat
        if SR.Attr and faDirectory = faDirectory then
            // --> ein Verzeichnis wurde gefunden
            // der Verzeichnisname steht in SR.Name
            // der vollständige Verzeichnisname (inkl. darüberliegender Pfade) ist
            // RootFolder + SR.Name
          if (SR.Name <> '.') and (SR.Name <> '..') then
            FindAllFiles(FileList, RootFolder + SR.Name, Mask, Recurse);
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
  if FindFirst(RootFolder + Mask, faAnyFile, SR) = 0 then
  try
    repeat
      if SR.Attr and faDirectory <> faDirectory then
      begin
          // --> eine Datei wurde gefunden
          // der Dateiname steht in SR.Name
          // der vollständige Dateiname (inkl. Pfadangabe) ist
          // RootFolder + SR.Name
        FileList.Add(RootFolder + SR.Name);
      end;
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;
Da es sich um rekursion handelt , wird erst zum tiefsten Punkt der Verzeichnisstruktur gewechselt (FindFirst und FindNext mit Maske *.*) dort wird dann FindFirst und FindNext mit der Suchmaske ausgeführt.

Dies ist bei Dir nicht der Fall, bei Dir wird zuerst nach einem File mit der Suchmaske *.ini gesucht.
Ist das erfolglos wird nicht nach Unterverzeichnissen gesucht.
Du müsstes Dein Funktion etwas umbauen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
DelphiKlaus

Registriert seit: 18. Okt 2006
100 Beiträge
 
Delphi 6 Professional
 
#5

Re: Findfirst...Findnext funktioniert nicht 100%ig

  Alt 8. Mär 2007, 08:17
Hallo,

wenn Du Ini-Dateien suchst und dann mit FindFirst (...) = 0 prüfst, ob Du eine gefunden hast, ist es doch kein Wunder, dass Du garnichts findest, wenn keine Ini-Datei vorhanden ist. Such mal nach '*.*' und werte selbst aus, ob es eine Ini-Datei oder ein Verzeichnis ist. Dann sollte es funktionieren.

Klaus
  Mit Zitat antworten Zitat
Gremlin

Registriert seit: 18. Apr 2006
Ort: Im Süden
176 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Findfirst...Findnext funktioniert nicht 100%ig

  Alt 8. Mär 2007, 08:22
Morgen,

dein Problem tritt doch nur auf, wenn du eine Dateimaske (zb. *.pas)
übergeben hast und keine passenden Dateien, aber mögliche andere Dateien
in evetuell vorhandenen Unterverzeichnissen vorkommen?!

Entweder suchst du immer nach '*.*' und maskierst selbst aus und kannst
somit auch die Unterverzeichnisse berücksichten (ich kann dir jetzt nichts
über den Overhead der FindFirst-Routine sagen) oder du berücksichtigst
beim Beginn bzw. Ende der Suche die Dateimaske. Wenn diese <> '*.*' ist,
dann musst du noch extra die Unterverzeichnisse im Verzeichnis suchen
(faDirectory) und diese zusätzlich untersuchen.

Gruss Gremlin
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.028 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Findfirst...Findnext funktioniert nicht 100%ig

  Alt 8. Mär 2007, 08:33
Hmmm, okay. Ich glaube ich werde dann wohl ALLE Dateien auflisten und die entsprechenden Dateien dann selbst filtern!! Danke!

SCRaT

EDIT: Hat so funktioniert. Vielen Dank für die Tips.
Michael Kübler
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

Re: Findfirst...Findnext funktioniert nicht 100%ig

  Alt 8. Mär 2007, 12:06
Zitat von scrat1979:
Hmmm, okay. Ich glaube ich werde dann wohl ALLE Dateien auflisten und die entsprechenden Dateien dann selbst filtern!!
Übrigens, die FindFirstFile/FindNextFile API Funktionen, die von FindFirst/FindNext aufgerufen werden liefern immer alle Dateien. Da kann man nicht auf eine Dateimaske einschränken. Diese Einschränkung wird erst von FindFirst/FindNext nachgerüstet, indem die nicht passenden Einträge übersprungen werden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.163 Beiträge
 
Delphi 12 Athens
 
#9

Re: Findfirst...Findnext funktioniert nicht 100%ig

  Alt 8. Mär 2007, 12:31
Zitat von jbg:
Übrigens, die FindFirstFile/FindNextFile API Funktionen, die von FindFirst/FindNext aufgerufen werden liefern immer alle Dateien. Da kann man nicht auf eine Dateimaske einschränken. Diese Einschränkung wird erst von FindFirst/FindNext nachgerüstet, indem die nicht passenden Einträge übersprungen werden.
Wie kommst du auf diese Idee?

Ich nutze diese WinAPI schon lange MSDN-Library durchsuchenFindFirstFile und kann dir das Gegenteil bestätigen.

und hier mal der Beweis aus'm MSDN

Zitat:
lpFileName:
A pointer to a null-terminated string that specifies a valid directory or path, and file name that can contain wildcard characters, for example, an asterisk (*) or a question mark (?).
...

Vielleicht solltest du dir nochmals die Quellen von FindFirst/FindNext in deinem Delphi genauer ansehn, also was diese wirklich machen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Findfirst...Findnext funktioniert nicht 100%ig

  Alt 8. Mär 2007, 12:39
da muss ich himitsu zustimmen. Wenn man den Quelltext anschaut sieht man das auch an die Apifunktion eine maske übergeben wird.
Im übrigen sollte man nicht "*.*" als Maske verwenden sondern "*". Schließlich will man alle Dateinamen und nicht nur die wo ein "." drin vorkommt. Zwar wird bei "*.*" auch alles ohne punkt gefunden aber wer weiß wann dieser Bug behoben wird.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  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 08:05 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