Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Findfirst,Findnext schulung (https://www.delphipraxis.net/96378-findfirst-findnext-schulung.html)

SaFu 23. Jul 2007 14:35


Findfirst,Findnext schulung
 
hi

da ich in der letzten zeit ziemlich oft probleme habe mehrere dateien aus einem ordner zu kopieren oder aufeinmal auszulesen bitte ich euch darum mir mal ne kleine schulung zu geben da ich das nich ganz versteh wie ich das mache.

ich weis zwar das es mit findfirst, findnext usw geht aber wie realiesiere ich das

z.b.

ich lade mir einen ordner eine fileListBox1 und will drei dateien aus diesem ordner in eine andere FileListBox2 kopieren aber nur die Dateien von gestern wäre das für den anfang zu kopliziert????

DeddyH 23. Jul 2007 14:42

Re: Findfirst,Findnext schulung
 
zunächst einmal benutzt man immer das Dreigespann FindFirst, FindNext und FindClose (oder deren API-Entsprechungen). Die interessanten Daten zu jeder gefundenen Datei befinden sich nach FindFirst und FindNext in dem Record TSearchRec. Schau Dir zu diesem Record mal die Hilfe an, dann wird Dir schon manches klarer. ;)

SirThornberry 23. Jul 2007 14:47

Re: Findfirst,Findnext schulung
 
FindFirst heißt ja übersetzt schon FindeErstes
FindNext heißt dann FindeNächstes
und Mit FindClose schließt man das gesuche hab.

Rufst du also FindFirst auf wird die Suche eingeleidet und das Ergebnis wird in dem übergebenen TSearchRec gespeichert.
Gibt FindFirst dir 0 zurück heißt es das mindestens einwas gefunden wurde (die suche also erfoglreich eingeleidet wurde.
Ist dies der Fall sollte man die Suche auch mit FindClose wieder schließen
Delphi-Quellcode:
if (FindFirst(....) = 0) then
begin
  FindClose(...);
end;
FindFirst gibt dir aber wie gesagt nur das erste zurück. Um an die anderen Ergebnisse der Suche zu kommen musst du FindNext aufrufen bis dir FindNext einen Wert ungleich 0 zurück gibt
Delphi-Quellcode:
if (FindFirst(....) = 0) then
begin
  repeat
    //hier kann der Datei-/Ordnername aus der TSearchRec-Struktur ausgelesen werden
  until FindNext(...) <> 0;
  FindClose(...);
end;

SaFu 23. Jul 2007 14:50

Re: Findfirst,Findnext schulung
 
ok

FindFirst sucht im Verzeichnis Path nach dem ersten Eintrag, der mit dem angegebenen Dateinamen und den festgelegten Attributen übereinstimmt. Das Ergebnis wird im Parameter F zurückgegeben. Den Feldern dieses Datensatzes können Sie die benötigten Informationen entnehmen. FindFirst gibt im Erfolgsfall 0 zurück, ansonsten einen Fehlercode.

Der Konstantenparameter Path enthält das Verzeichnis und die Dateinamensmaske. Es können auch Platzhalterzeichen verwendet werden. '.\test\*.*' gibt beispielsweise alle Dateien im aktuellen Laufwerk an.

Delphi-Quellcode:
function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;
das heist mit der funktion übergebe ich den pfad in dem er die tateien suchen soll und er gibt sie mir dann alle zurück

Delphi-Quellcode:
function FindFirst(und hier der Pfad zum ordner)????
wie gesagt ich habe keine ahnung

DeddyH 23. Jul 2007 14:53

Re: Findfirst,Findnext schulung
 
Ein paar Beispiele:
Delphi-Quellcode:
FindFirst('C:\*.*',faHidden,Rec);
Alle versteckten Dateien im Wurzelverzeichnis von C:
Delphi-Quellcode:
FindFirst('C:\Windows\*',faDirectory,Rec);
Alle Unterverzeichnisse von C:\Windows

Sind Dir die Attribute egal, dann nimm faAnyFile.

SaFu 23. Jul 2007 15:00

Re: Findfirst,Findnext schulung
 
ok ich habe jetzt ein neues projekt gemacht in dem habe ich eine DirectoryListBox jetzt will ich mir alle ordner anzeigen lassen im Windows ordner

mach ich dann so

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
Var pfad :string;
begin
 pfad:= FindFirst('C:\Windows\*',faDirectory,Rec);
   DirectoryListBox1:= (pfad);
end;

SirThornberry 23. Jul 2007 15:06

Re: Findfirst,Findnext schulung
 
stop! eine Directorylistbox macht alles eigenständig! Sie füllt sich eigenständig und hat nix mit FindFirst etc. zu tun. Nimm eine normale Listbox. Und schau dir mein Beispiel von oben an.

SaFu 23. Jul 2007 15:14

Re: Findfirst,Findnext schulung
 
Also muss ich erstmal ein Record vm typ TSearchRect ertsellen und die FileListbox muss ich auch schon auf einen ordner setzen??

DeddyH 23. Jul 2007 15:15

Re: Findfirst,Findnext schulung
 
Wieso denn jetzt auf einmal eine FileListbox? Nimm eine stinknormale Listbox und schau Dir das Beispiel von marabu aus dem anderen Thread noch einmal an.

SaFu 23. Jul 2007 15:16

Re: Findfirst,Findnext schulung
 
ok mach ich

SaFu 23. Jul 2007 15:23

Re: Findfirst,Findnext schulung
 
OK
habe es jetzt so

Delphi-Quellcode:
 
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,DateUtils, FileCtrl;

type
  TFindFilesOption = (ffoExcludePath, ffoExcludeExt);
    TFindFilesOptions = set of TFindFilesOption;
    TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

  private
   function FindFiles(const fileExpr: String; files: TStrings;options: TFindFilesOptions): Boolean; { Private-Deklarationen }

  public
   { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.FindFiles(const fileExpr: String; files: TStrings;
  options: TFindFilesOptions): Boolean;
var
  sr2: TSearchRec;
  path2: string;
  extWanted: Boolean;
begin
  Result := True;
  files.Clear;
  files.BeginUpdate;
  if ffoExcludePath in options
    then path2 := ''
    else path2 := ExtractFilePath(fileExpr);
  extWanted := not (ffoExcludeExt in options);
  if FindFirst(fileExpr, faArchive, sr2) = 0 then
  begin
    repeat
      if extWanted
        then files.Add(path2 + sr2.Name)
        else files.Add(ChangeFileExt(path2 + sr2.Name, ''));
    until FindNext(sr2) <> 0;
    FindClose(sr2);
  end else Result := False;
  files.EndUpdate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 FindFiles('c:\WINDOWS\'+ '\*', ListBox1.Items, [ffoExcludePath, ffoExcludeExt]);
end;

end.
aber geht das jetzt auch kurzer das war ja ohne endungen

DeddyH 23. Jul 2007 15:29

Re: Findfirst,Findnext schulung
 
Ja sicher ohne Endungen, hast Du doch auch gesagt. Sonst nimm mal das ffoExcludeExt aus den Optionen.

SaFu 23. Jul 2007 15:36

Re: Findfirst,Findnext schulung
 
kannst du mir vielleicht ein beispiel geben wie z.b alle .ini dateien aus dem ordenr windows gelesen werden und in der listbox angezeigt werden vieleicht verstehe ich es dann besser

sorry für meine dumme fragen will es aber verstehen

DeddyH 23. Jul 2007 15:42

Re: Findfirst,Findnext schulung
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Rec: TSearchRec;
    i: integer;
begin
  i := FindFirst('C:\Windows\*.ini',faAnyFile,Rec);
  while i = 0 do
    begin
      ListBox1.Items.Add(Rec.Name);
      i := FindNext(Rec);
    end;
  FindClose(Rec);
end;

SirThornberry 23. Jul 2007 15:45

Re: Findfirst,Findnext schulung
 
@DaddyH: fast richtig. FindClose ist nicht notwendig wenn FindFirst fehl schlägt:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Rec: TSearchRec;
begin
  if FindFirst('C:\Windows\*.ini',faAnyFile,Rec) = 0 then
  begin
    repeat
      ListBox1.Items.Add(Rec.Name);
    until FindNext(Rec) <> 0;
    FindClose(Rec);
  end;
end;

DeddyH 23. Jul 2007 15:49

Re: Findfirst,Findnext schulung
 
Aber es schadet auch nicht. :zwinker:

SaFu 23. Jul 2007 15:49

Re: Findfirst,Findnext schulung
 
alle zwei cods gehen

hab ich das mit meiner erklärung richtig verstanden
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Rec: TSearchRec;
begin
  if FindFirst('C:\Windows\*.ini',faAnyFile,Rec) = 0 then//da eins gefunden = 0
  begin
    repeat
      ListBox1.Items.Add(Rec.Name);
    until FindNext(Rec) <> 0; //wenn nichts gefunden dann 1 also schließen
    FindClose(Rec);
  end;
end;
was sagt jetzt dieses .name aus

SirThornberry 23. Jul 2007 15:51

Re: Findfirst,Findnext schulung
 
genau. 0 = kein Fehler
ungleich 0 = Fehler
Ein Fehler ist zum Beispiel wenn keine weiteren Dateien vorhanden sind.

DeddyH 23. Jul 2007 15:51

Re: Findfirst,Findnext schulung
 
Name ist ein Feld des Records TSearchRec. Da steht halt der Dateiname drin.

SaFu 23. Jul 2007 15:52

Re: Findfirst,Findnext schulung
 
also kannich anstatt denn namen mir auch andere atributte der dateien anzeigen lassen??

DeddyH 23. Jul 2007 15:54

Re: Findfirst,Findnext schulung
 
Natürlich, schau doch endlich mal zu TSearchRec in die Hilfe.

SaFu 23. Jul 2007 16:02

Re: Findfirst,Findnext schulung
 
hab ich doch schon aber von dem name steht z.b nichts drin

Delphi-Quellcode:
Konstante    Wert   Beschreibung   

faReadOnly   1   Schreibgeschützte Datei   
faHidden    2   Verborgene Datei   
faSysFile    4   Systemdatei   
faVolumeID   8   Laufwerks-ID   
faDirectory 16  Verzeichnisdatei   
faArchive    32  Archivdatei   
faSymLink    64  Symbolische Verknüpfung   
faAnyFile    71  Beliebige Datei

Klaus01 23. Jul 2007 16:29

Re: Findfirst,Findnext schulung
 
Also bei mir steht da sehr wohl etwas drin, vom Namen:

Zitat:

Delphi-Quellcode:
Unit

SysUtils

type
TSearchRec = record
      Time: Integer;
      Size: Integer;
      Attr: Integer;
      Name: TFileName;
      ExcludeAttr: Integer;
      FindHandle: THandle;
      FindData: TWin32FindData;
end;

Grüße
Klaus

SaFu 23. Jul 2007 16:31

Re: Findfirst,Findnext schulung
 
Stimmt klaus

muss ich das record dann selber schreiben um z.b die große der dateien zu ermitteln???

Klaus01 23. Jul 2007 16:34

Re: Findfirst,Findnext schulung
 
Zitat:

Zitat von fuknersascha
Stimmt klaus

muss ich das record dann selber schreiben um z.b die große der dateien zu ermitteln???

Nein, die Struktur ist festgelegt und in der Unit SysUtils definiert.
Du mußt nur eine Variable mit dem Typen erstellen.

Die Filegröße ist dann im Feld Size hinterlegt.

Grüße
Klaus

SaFu 23. Jul 2007 16:37

Re: Findfirst,Findnext schulung
 
z.b so

procedure TForm1.Button1Click(Sender: TObject);
var Rec: TSearchRec;
groesse : size;
begin

DeddyH 23. Jul 2007 16:38

Re: Findfirst,Findnext schulung
 
Und dann für jede Datei
Delphi-Quellcode:
groesse := Rec.Size;
[EDIT]welchen Dateityp soll denn size repräsentieren?[/EDIT]

SaFu 23. Jul 2007 16:41

Re: Findfirst,Findnext schulung
 
dateientyp repräsentieren????

DeddyH 23. Jul 2007 16:43

Re: Findfirst,Findnext schulung
 
Ich meine die Zeile
Delphi-Quellcode:
 groesse : size;
Du meintest sicher
Delphi-Quellcode:
 groesse : Cardinal;

SaFu 23. Jul 2007 16:48

Re: Findfirst,Findnext schulung
 
naja cardinal ist da ja das richtige da es ja keine negativen größen gibt :-D

und wie lasse ich mir jetzt z.b die größen der dateien ausgeben vom beispiel

DeddyH 23. Jul 2007 16:55

Re: Findfirst,Findnext schulung
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Rec: TSearchRec;
begin
  if FindFirst('C:\Windows\*.ini',faAnyFile,Rec) = 0 then//da eins gefunden = 0
  begin
    repeat
      ListBox1.Items.Add(Format('%s -> %d KB',[Rec.Name,Rec.Size div 1024]));
    until FindNext(Rec) <> 0; //wenn nichts gefunden dann 1 also schließen
    FindClose(Rec);
  end;
end;

SaFu 23. Jul 2007 16:57

Re: Findfirst,Findnext schulung
 
ahh

und alles was ich jetzt über die dateien wissen will muss einfach mit einem komma hinten dran gehäng werden??

DeddyH 23. Jul 2007 16:59

Re: Findfirst,Findnext schulung
 
Z.B. Allerdings würde ich hier eine Listview mit ViewStyle vsReport bevorzugen ;)

SaFu 23. Jul 2007 17:03

Re: Findfirst,Findnext schulung
 
das heisst
wenn ich das so schreibe

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Rec: TSearchRec;
begin
  if FindFirst('C:\Windows\*.ini',faAnyFile,Rec) = 0 then//da eins gefunden = 0
  begin
    repeat
      ListBox1.Items.Add(Format('%s -> %d KB %d',[Rec.Name,Rec.Size div 1024,Rec.Attr]));
    until FindNext(Rec) <> 0; //wenn nichts gefunden dann 1 also schließen
    FindClose(Rec);
  end;
end;
bekomme ich als Rec.Attr eine 32 und das ist dann eine archive datei????

DeddyH 23. Jul 2007 17:11

Re: Findfirst,Findnext schulung
 
Richtig, u.zw. nur Archiv ohne weitere Attribute.

DeddyH 23. Jul 2007 17:16

Re: Findfirst,Findnext schulung
 
Du könntest das z.B. so darstellen (nur ein Vorschlag):
Delphi-Quellcode:
function AttrToChars(Attr: integer): string;
begin
  Result := '';
  if (Attr and faDirectory) > 0 then
    Result := 'D';
  if (Attr and faArchive) > 0 then
    Result := Result + 'A';
  if (Attr and faReadOnly) > 0 then
    Result := Result + 'R';
  if (Attr and faHidden) > 0 then
    Result := Result + 'H';
  if (Attr and faSysFile) > 0 then
    Result := Result + 'S';
end;
Eingabeparameter ist dann Rec.Attr ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz