![]() |
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???? |
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. ;)
|
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:
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
if (FindFirst(....) = 0) then
begin FindClose(...); end;
Delphi-Quellcode:
if (FindFirst(....) = 0) then
begin repeat //hier kann der Datei-/Ordnername aus der TSearchRec-Struktur ausgelesen werden until FindNext(...) <> 0; FindClose(...); end; |
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:
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
function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;
Delphi-Quellcode:
wie gesagt ich habe keine ahnung
function FindFirst(und hier der Pfad zum ordner)????
|
Re: Findfirst,Findnext schulung
Ein paar Beispiele:
Delphi-Quellcode:
Alle versteckten Dateien im Wurzelverzeichnis von C:
FindFirst('C:\*.*',faHidden,Rec);
Delphi-Quellcode:
Alle Unterverzeichnisse von C:\Windows
FindFirst('C:\Windows\*',faDirectory,Rec);
Sind Dir die Attribute egal, dann nimm faAnyFile. |
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; |
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.
|
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??
|
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.
|
Re: Findfirst,Findnext schulung
ok mach ich
|
Re: Findfirst,Findnext schulung
OK
habe es jetzt so
Delphi-Quellcode:
aber geht das jetzt auch kurzer das war ja ohne endungenunit 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. |
Re: Findfirst,Findnext schulung
Ja sicher ohne Endungen, hast Du doch auch gesagt. Sonst nimm mal das ffoExcludeExt aus den Optionen.
|
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 |
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; |
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; |
Re: Findfirst,Findnext schulung
Aber es schadet auch nicht. :zwinker:
|
Re: Findfirst,Findnext schulung
alle zwei cods gehen
hab ich das mit meiner erklärung richtig verstanden
Delphi-Quellcode:
was sagt jetzt dieses .name aus
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; |
Re: Findfirst,Findnext schulung
genau. 0 = kein Fehler
ungleich 0 = Fehler Ein Fehler ist zum Beispiel wenn keine weiteren Dateien vorhanden sind. |
Re: Findfirst,Findnext schulung
Name ist ein Feld des Records TSearchRec. Da steht halt der Dateiname drin.
|
Re: Findfirst,Findnext schulung
also kannich anstatt denn namen mir auch andere atributte der dateien anzeigen lassen??
|
Re: Findfirst,Findnext schulung
Natürlich, schau doch endlich mal zu TSearchRec in die Hilfe.
|
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 |
Re: Findfirst,Findnext schulung
Also bei mir steht da sehr wohl etwas drin, vom Namen:
Zitat:
Klaus |
Re: Findfirst,Findnext schulung
Stimmt klaus
muss ich das record dann selber schreiben um z.b die große der dateien zu ermitteln??? |
Re: Findfirst,Findnext schulung
Zitat:
Du mußt nur eine Variable mit dem Typen erstellen. Die Filegröße ist dann im Feld Size hinterlegt. Grüße Klaus |
Re: Findfirst,Findnext schulung
z.b so
procedure TForm1.Button1Click(Sender: TObject); var Rec: TSearchRec; groesse : size; begin |
Re: Findfirst,Findnext schulung
Und dann für jede Datei
Delphi-Quellcode:
[EDIT]welchen Dateityp soll denn size repräsentieren?[/EDIT]
groesse := Rec.Size;
|
Re: Findfirst,Findnext schulung
dateientyp repräsentieren????
|
Re: Findfirst,Findnext schulung
Ich meine die Zeile
Delphi-Quellcode:
Du meintest sicher
groesse : size;
Delphi-Quellcode:
groesse : Cardinal;
|
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 |
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; |
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?? |
Re: Findfirst,Findnext schulung
Z.B. Allerdings würde ich hier eine Listview mit ViewStyle vsReport bevorzugen ;)
|
Re: Findfirst,Findnext schulung
das heisst
wenn ich das so schreibe
Delphi-Quellcode:
bekomme ich als Rec.Attr eine 32 und das ist dann eine archive datei????
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; |
Re: Findfirst,Findnext schulung
Richtig, u.zw. nur Archiv ohne weitere Attribute.
|
Re: Findfirst,Findnext schulung
Du könntest das z.B. so darstellen (nur ein Vorschlag):
Delphi-Quellcode:
Eingabeparameter ist dann Rec.Attr ;)
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; |
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