AGB  ·  Datenschutz  ·  Impressum  







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

Frage mal wieder!

Ein Thema von IOAH · begonnen am 18. Apr 2005 · letzter Beitrag vom 19. Apr 2005
Antwort Antwort
IOAH

Registriert seit: 6. Jul 2004
30 Beiträge
 
#1

Frage mal wieder!

  Alt 18. Apr 2005, 21:40
Hi Leutz!

Ich war schon vor paar Wochen mit einem ähnlichen Problem hier, aber jetzt hab ich mal eine Frage. Ich hab eine prozedur programmiert, die mir nur die Dateien (!) eines gesamten Laufwerks ausgeben soll... Aber irgendwie ist in meinem Script der Wurm drin und er gibt mir nur die Dateien des Stammordners aus... Schaut es euch bitte an, vielleicht findet ihr ja einen Fehler...

Code:
procedure suchedeninhalt(path:string;memo:tmemo);
var
  searchResult : TSearchRec;

begin
if FindFirst(path+'*.*', faanyfile, searchResult) = 0 then
  begin
    repeat
      if (searchresult.Attr and fadirectory)=0 then
      memo.Lines.Add(searchresult.Name);
    until FindNext(searchResult) <> 0;
  FindClose(searchResult);
  end;
end;
Vielen Dank schonmal

Greez, IOAH
Hau, ich habe gesprochen...
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

Re: Frage mal wieder!

  Alt 18. Apr 2005, 21:48
änder mal bitte den Titel in einen sinnvollen Titel! Mag ja kein Admin oder Mod spielen aber so weiß doch keiner was du meinst!

Aber um dir trotzdem weiterzuhelfen... Ich habe das hier gefunden
Code:
Rekursiv nach Dateien suchen
FindFirst, FindNext


--------------------------------------------------------------------------------

Um nach bestimmten Dateien auf der Festplatte zu suchen muss man die Funktionen FindFirst und FindNext benutzen. Wenn man nur nach Dateien in einem Verzeichnis suchen möchte ist dies sehr einfach. Man sucht einfach mit FindFirst nach der ersten Datei und startet dann eine Repeat-Schleife. Am Ende eines jeden Durchlaufs wird die nächste Datei in dem Verzeichnis gesucht (FindNext).

Etwas komplizierter wird die Sache, wenn man auch in Unterverzeichnissen nach Dateien suchen möchte. Dann muss sich die Funktion nämlich selbst aufrufen - immer genau dann, wenn ein Verzeichnis gefunden wurde. Dies nennt man rekursiv.

In der untenstehenden Procedure wurde der gesamte Aufruf gekapselt. Die Procedure erwartet fünf Parameter:

- Das Verzeichnis (z.B. 'C:\Programme')
- Die Suchmaske (z.B. '*.*' oder '*.doc')
- Die Ausgabeliste (z.B. Listbox1.Items)
- Rekursive Suche (bei True werden die Verzeichnisse rekursiv durchsucht, also mitsamt allen Unterverzeichnissen, bei False wird nur das angegebene Verzeichnis durchsucht).
- Ob die Ausgabeliste vorher gelöscht werden soll, bei True werden nur die neuen Suchergebnisse zurückgegeben, bei False bleiben bisherige Einträge erhalten.

procedure GetFilesInDirectory(Directory: String; const Mask: String;
                              List: TStrings;
                              WithSubDirs, ClearList: Boolean);

procedure ScanDir(const Directory: String);
var
  SR: TSearchRec;
begin
  if FindFirst(Directory + Mask, faAnyFile - faDirectory, SR) = 0 then try
    repeat
      List.Add(Directory + SR.Name)
    until FindNext(SR) <> 0;
  finally
    FindClose(SR);
  end;

  if WithSubDirs then begin
    if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then try
      repeat
        if (SR.Attr = faDirectory) and
           (SR.Name <> '.') and (SR.Name <> '..') then
          ScanDir(Directory + SR.Name + '\');
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;
  end;
end;

begin
  List.BeginUpdate;
  try
    if ClearList then
      List.Clear;
    if Directory = '' then Exit;
    if Directory[Length(Directory)] <> '\' then
      Directory := Directory + '\';
    ScanDir(Directory);
  finally
    List.EndUpdate;
  end;
end;
Ein Beispielaufruf könnte so aussehen:

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetFilesInDirectory('C:\', '*.*', Listbox1.Items, False, True);
end;
In diesem Beispiel werden alle Dateien (*.*) im Verzeichnis 'C:\' in 'Listbox1.Items' gesteckt. Unterverzeichnisse werden nicht durchsucht (False).

FindFirst

Das Kernstück dieser Procedure ist eigentlich der Aufruf von FindFirst. Diese Funktion sucht nach der ersten Datei im angegebenen Verzeichnis.

Sie erwartet drei Pramater.

- Pfad + Suchmaske
- Dateiattribut
- Referenzparameter vom Typ TsearchRec

Pfad und Suchmaske sollten klar sein (z.B. C:\*.*). Der zweite Parameter kann folgende Werte annehmen:

faReadOnly     Schreibgeschützte Datei
faHidden       Versteckte Datei
faSysFile      Systemdatei
faVolumeID     Laufwerks-ID-Datei
faDirectory    Verzeichnis
faArchive      Archivdatei
faAnyFile      Beliebige Datei
Der Parameter gibt an, welche Dateien mit welchem Dateiattribut gesucht werden sollen. Auch kann auf diese Weise nach Verzeichnissen gesucht werden können.

Dem dritten Parameter werden letztendlich bei einem Sucherfolg die Dateiinformationen übergeben:

type
  TSearchRec = record   
    Time: Integer;   
    Size: Integer;   
    Attr: Integer;   
    Name: TFileName;   
    ExcludeAttr: Integer;
    FindHandle: THandle;
    FindData: TWin32FindData;
  end;
Auf diese Weise kommt man auch an den eigentlichen Dateinamen, die Dateigröße oder an das Erstellungsdatum:

procedure TForm1.Button1Click(Sender: Tobject);
var
  F: TSearchRec;
begin
  if FindFirst(ed_dateiname.text, faAnyFile, F) = 0 then try
    Label1.Caption := F.Name
    Label2.Caption := IntToStr(F.Size);
  finally
    FindClose(F);
  end;
end;
FindNext setzt einfach nur das Filehandle auf die nächste entsprechende Datei. Wieder muss die Variable vom Typ TSearchRec als Referenzparameter übergeben werden.

Da beim Aufruf von FindFirst usw. Ressourcen belegt werden, müssen sie wieder freigegeben werden. Dies geschieht mit dem Aufruf von FindClose.

Überarbeitet von Peter J. Haas
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
IOAH

Registriert seit: 6. Jul 2004
30 Beiträge
 
#3

Re: Frage mal wieder!

  Alt 18. Apr 2005, 22:02
Oh, danke... Nun klappt es und es ist auf jeden Fall die stilvollere Lösung...



IOAH
Hau, ich habe gesprochen...
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#4

Re: Frage mal wieder!

  Alt 18. Apr 2005, 22:14
Zitat von s.h.a.r.k:
änder mal bitte den Titel in einen sinnvollen Titel! Mag ja kein Admin oder Mod spielen aber so weiß doch keiner was du meinst!

Aber um dir trotzdem weiterzuhelfen... Ich habe das hier gefunden
Hätte da nicht einfach auch bloß ein Link zum Thema gereicht?
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Frage mal wieder!

  Alt 18. Apr 2005, 22:15
Hi IOAH,
wie dich s.h.a.r.k. bereits gebeten hat, bitte ich dich nochmal deinem Beitrag einen aussagekräftigen Titel zu verleihen. Siehe dazu auch FAQ-Eintrag zum Stichwort "8""8".

Danke,
Chris
  Mit Zitat antworten Zitat
IOAH

Registriert seit: 6. Jul 2004
30 Beiträge
 
#6

Re: Frage mal wieder!

  Alt 18. Apr 2005, 22:21
Hehe, lol... Den Kodex kannte ich bis jetzt net, aber ich werd mich in Zukunft dran halten ^^
Hau, ich habe gesprochen...
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Frage mal wieder!

  Alt 19. Apr 2005, 06:39
Zitat von IOAH:
Hehe, lol... Den Kodex kannte ich bis jetzt net, aber ich werd mich in Zukunft dran halten ^^
Warum erst in Zukunft Du kannst doch diesen Titel auch ändern!

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von glkgereon
glkgereon

Registriert seit: 16. Mär 2004
2.287 Beiträge
 
#8

Re: Frage mal wieder!

  Alt 19. Apr 2005, 07:36
ich glaube das die pfade die du hattest einfach wie C:*.* oder C:\Windows*.* aussaen, also ein \ fehlte.

ansonsten müsste dein code funzen
»Unlösbare Probleme sind in der Regel schwierig...«
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#9

Re: Frage mal wieder!

  Alt 19. Apr 2005, 08:04
Zitat von glkgereon:
ich glaube das die pfade die du hattest einfach wie C:*.* oder C:\Windows*.* aussaen, also ein \ fehlte.

ansonsten müsste dein code funzen
Ich glaueb du hast das Problem nicht verstanden. Es geht doch vielmehr darum, dass die Unterverzeichnisse nicht angezeigt werden, aber der angebene Pfad selbst schon.
Und so nebenbei:
Zitat von IOAH:
Oh, danke... Nun klappt es und es ist auf jeden Fall die stilvollere Lösung...
Also mach' dir nicht zu viel Mühe.

@IOHA: du editierts einfach den ersten Beitrag, mit dem du den Thread eröffnet hast, so kannst du den Titel ändern.
Auch wenn das <Problem gelöst ist, es geht eben einfach darum, dass wenn nochmal jemand das gleiche Problem hat er möglicherweise die Boradsuche verwendet. Auf Standard durchsucht die zwar auch den Nachrihctentzext, aber wenn man dann zwei Seiten Ergebniss bekommt, ist es ganz praktisch, wenn man direkt am Titel sehen kann, ob es sich um sein Problem handelt und sich nicht jeden Thread einzeln durchlesen muss, nur um festzustellen, dass das überhaupt nichts zum Thema tut. Also tu' uns allen einen Gefallen und ändere den Titel!!
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:42 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