Ersatz für TWin32FindData / Dateien suchen

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Ersatz für TWin32FindData / Dateien suchen

Beitrag von Targion »

Hallo!
Gibt es einen Ersatz für Win32FindData für Lazarus unter Linux? Oder gibt es eine Andere Möglichkeit, rekursiv in einem Ordner nach Dateien zu suchen?

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

wozu brauch man da Win32FindData ?

Dazu brauchst nur FindFirst,FindNext und nen TSearchRec
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

Geht doch mit
FindFirst
FindNext
FindClose

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Dachte ich auch. Nachdem mein eigener (speziell für meine Zwecke angepasster) Code nicht funktioniert hat, habe ich den aus der DP ausprobiert, um zu sehen, ob die Suche unter Linux überhaupt funktioniert:

Code: Alles auswählen

procedure FindAllFiles(var FileList: TStrings; RootFolder: string; Mask: string =
  '*.*'; Recurse: Boolean = True);
 
var
  SR: TSearchRec;
begin
  RootFolder := IncludeTrailingPathDelimiter(RootFolder);
 
  if Recurse then
    if FindFirst(RootFolder + '*.*', faAnyFile, SR) = 0 then
    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;
end;
Doch auch dieser Listet unter Linux nur die Dateien im RootFolder auf, die in den Unterordnern werden nicht berücksichtigt.
Zuletzt geändert von Targion am Di 8. Jan 2008, 20:20, insgesamt 1-mal geändert.

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Guckst Du hier... :lol:

http://www.lazarusforum.de/downloads.ph ... etail&id=9" onclick="window.open(this.href);return false;
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Nein, der Code sucht leider auch nicht rekursiv. Aber ich habe für mein Problem jetzt eine andere Lösung gefunden, Danke trotzdem für die Hilfe!

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Bitte?

Bis jetzt hat er's gemacht und geändert hab ich nix. Der sucht auch in Unterverzeichnissen wenn man ihm das mitteilt.
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Die Demo funktioniert nicht richtig. Wenn ich auf den Button drücke, dann sucht das Tool nur im aktuellen Verzeichnis.
Zuletzt geändert von Targion am Di 8. Jan 2008, 14:13, insgesamt 1-mal geändert.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Wie wärs dann, wenmn du den fehler suchen würdest ?
Du kannst doch nicht dauerhaft mit irgendwelchen Codes ausm Netz klarkommen !
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

Quatsch, das wäre ja basteln und nicht programmieren! Ich schaue mir den Code nochmal an, hatte aber bis jetzt keine Zeit, da ich eine Lösung für mein Projekt gefunden habe, wie man die Suche umgehen kann.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Beitrag von monta »

http://lazarus-ccr.sourceforge.net/docs ... files.html" onclick="window.open(this.href);return false; ;)
Johannes

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

if SR.Attr and faDirectory = faDirectory then
daran liegt es in beiden schleifen verwendest du das.
Kann es ein das in deinem Verzeichnis keine Unterverzeichnisse sind ?

Ich verstehe den ersten Abschnitt so das er nur nach Verzeichnissen sucht aber nicht nach Dateien. Nim mal diese Zeile raus. Dann sollte es eigentlich gehen.

PS: Wo ist der unterschied zwischen Basteln und Programmieren(ist doch beides das gleiche oder ?)
MFG
Michael Springwald

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Beitrag von Targion »

@Monta: :mrgreen: Wenn alles so einfach wäre! Mit dem Befehl funktioniert's super! Danke!
@pluto: Hmm. Meinen wir das selbe Stück Code? Bei mir gibt es nur einen ähnlichen Teil, und dieser ist unbedingt notwendig, um einen Ordner zu identifizieren.
P.S: Wenn man etwas bastelt benutzt man schon oder nur Fertigteile. Beim Programmieren denkt man sich alles selbst aus (würde ich sagen :wink: )
(Obwohl... Wenn es Code schon fertig gibt und man ihn versteht, wäre es ja blöd das Rad neu zu erfinden und den Code selbst nochmal zu erstellen. :) )

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Na ich weis nicht, in beiden Teil verwendest du diese Abfragen.
und du möchtest nur eine Datei liste bekommen.. Da stimmt auf jeden Fall was nicht.

Ich sehe gerade: Zeile 28 Hat mich etwas durch einander gebracht. Der Code scheint inordnung zu sein. Drücke doch mal bei FindFirst auf F1 da ist ein Prima beispiel bei... ich meine auch für rekusiv.

Ich denke der Fehler sollte schon gefunden werden....

Edit: jetzt sehe ich den Fehler: Die zweite schleife muss zu erst...
MFG
Michael Springwald

schnullerbacke
Beiträge: 1187
Registriert: Mi 13. Dez 2006, 10:58
OS, Lazarus, FPC: Winux (L 1.2.xy FPC 2.6.z)
CPU-Target: AMD A4-6400 APU
Wohnort: Hamburg

Beitrag von schnullerbacke »

Targion hat geschrieben:Die Demo funktioniert nicht richtig. Wenn ich auf den Button drücke, dann sucht das Tool nur im aktuellen Verzeichnis.
Jupp, in der Suchroutine ist eine Zeile auskommentiert. Mit der kann man mit alle Dateien anzeigen lassen. Und bei mir durchsucht die auch alle Unterverzeichnisse im Hauptverzeichnis.
Kannst Dir ja spaßeshalber regular expressions einbauen. Dann geht auch noch mehr.

Zu beachten ist allerdings, das die Routine "case sensitiv" arbeitet. Alles Sachen die man leicht ändern kann... :wink:
Humor ist der Knopf, der verhindert, daß uns der Kragen platzt.

(Ringelnatz)

Antworten