Datein
Datein
Hallo Forum
Ich brauche eine Methode um Datein und Ordner anzuzeigen ,ich weiß bereits das das über FindFirst,FindNext und FindClose funktioniert aber ich habe das nicht so richtig begriffen kann mir einer eine gute Erklärung oder einen Link sagen wo es relativ einfach zu verstehen ist.
MfG
DDKFM
Ich brauche eine Methode um Datein und Ordner anzuzeigen ,ich weiß bereits das das über FindFirst,FindNext und FindClose funktioniert aber ich habe das nicht so richtig begriffen kann mir einer eine gute Erklärung oder einen Link sagen wo es relativ einfach zu verstehen ist.
MfG
DDKFM
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2805
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: Datein
Das ist ein wenig unspezifisch formuliert. Willst du Inhalte von Verzeichnissen in einer GUI anzeigen? Oder willst du den Inhalt in Variablen weiterverwenden?
Schreib doch mal ein wenig mehr dazu.
Schreib doch mal ein wenig mehr dazu.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Re: Datein
Ich muss eine StringList erstellen wo alle Datein und Ordner aufgelistet sind, bei einer GUI Anwendung würde ich das über eine FileListBox machen aber ich möchte das in einer Konsolenanwendung einbinden daher müsste ich wissen wie das "von Hand" geht.
Ich will eine Konsolenanwendung schreiben die im Hintergrund läuft und ständig einen Ordner kontrolliert ob Datein geändert wurden und diese dann als Kopie an einen anderen Ordner schickt.
Ich will eine Konsolenanwendung schreiben die im Hintergrund läuft und ständig einen Ordner kontrolliert ob Datein geändert wurden und diese dann als Kopie an einen anderen Ordner schickt.
Re: Datein
Was verstehst denn du genau nicht?
Ich mein, das kann man ja beliebig oft googlen.
Z.B.
http://www.delphibasics.co.uk/RTL.asp?Name=FindNext
Welche Erklärung fehlt dir denn?
Ich mein, das kann man ja beliebig oft googlen.
Z.B.
http://www.delphibasics.co.uk/RTL.asp?Name=FindNext
Welche Erklärung fehlt dir denn?
-
- Beiträge: 6900
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Datein
Code: Alles auswählen
uses
SysUtils;
var
searchResult: TSearchRec;
begin
if FindFirst('c:\windows\*.*', faAnyFile, searchResult) = 0 then begin
repeat
Writeln(searchResult.Name);
until FindNext(searchResult) <> 0;
FindClose(searchResult);
end;
readln;
end.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2805
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: Datein
Dafür gibt es andere Möglichkeiten.DDKFM hat geschrieben:Ich will eine Konsolenanwendung schreiben die im Hintergrund läuft und ständig einen Ordner kontrolliert ob Datein geändert wurden[...]
- Linux: inotify (http://www.freepascal.org/docs-html/rtl ... watch.html)
- Windows: FindFirstChangeNotification (http://msdn.microsoft.com/en-us/library ... 85%29.aspx)
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Re: Datein
Hallo DDKFM,DDKFM hat geschrieben:Ich brauche eine Methode um Datein und Ordner anzuzeigen ,ich weiß bereits das das über FindFirst,FindNext und FindClose funktioniert aber ich habe das nicht so richtig begriffen
Mal davon abgesehen, daß es, wie M.Fuchs anmerkte, möglicherweise viel weitergehendere Methoden gibt, Deine Aufgabe zu lösen: Es gibt eine sehr elegante Möglichkeit, Dateien in einer Stringliste zu erfassen, nämlich mithilfe der Funktion FindAllFiles:
Code: Alles auswählen
function FindAllFiles(const SearchPath: String; SearchMask: String = ''; SearchSubDirs: Boolean = true): TStringList;
FindAllFiles erstellt die Stringliste selbst, auch das kannst Du Dir also sparen (Du mußt sie nur als Variable deklarieren). Genauer gesagt, darfst Du sie auch gar nicht selbst erstellen, weil Du Dir sonst eine Speicherleiche einhandelst: Die selbst erzeugte Stringliste verschwindet nämlich ins Nirvana, wenn Du die Variable SL später auf die von FindAllFiles erzeugte neue Stringliste umbiegst. Freigeben mußt Du sie allerdings schon selbst:
Code: Alles auswählen
var
SL : TStringList;
begin
// Falsch wäre nun: SL := TStringList.Create;
SL := FindAllFiles('MeinVerzeichnis', '*.pas', true); // erstellt SL und listet alle pas-Dateien im Verzeichnis incl. aller Unterverzeichnisse dort auf
...
SL.Free;
end;
Gruß Rüdiger
Re: Datein
Danke erstmal für die Funktion ist sehr praktisch und danke für den die Erläufterung ich hätte jetzt auch erst die Stringlist erstellt und dann die Funktion benutzt. Und ich merke jetzt erstmal wie blöd ich bin ich hab gegoogelt und hier im Lazarusforum gefragt ABER in der Hilfe zu schauen wäre natürlich zu einfach.
Re: Datein
DDKFM hat geschrieben:... ich merke jetzt erstmal wie blöd ich bin ich hab gegoogelt und hier im Lazarusforum gefragt ABER in der Hilfe zu schauen wäre natürlich zu einfach.

Ist schon okay: Auch die Methode, wie man am besten an Informationen kommt, will ja erstmal gelernt sein. Generell ist bei solchen Fragen die Lazarus-Hilfe immer der allererste Anlaufpunkt (die ist bei mir immer offen, ich komme normalerweise keine 3 Zeilen weit, ohne dort irgendwas nachzuschlagen). Leider hat sie auch ihre Grenzen, z.B. daß man die Stringliste bei FindAllFiles tunlichst nicht selbst erstellen sollte, steht dort nicht. Am besten ist, Du rechnest mit beidem: Immer erst die Hilfe abgrasen, und davon ausgehend bei Unklarheiten dann (und sei's auch nur sicherheitshalber) quer recherchieren.
Außerdem: Für uns Nicht-Genies besteht nunmal 90 % der Arbeit beim Programmieren darin, rauszufinden, wie's gehen könnte. Das ist also ganz normal!
Gruß Rüdiger
-
- Beiträge: 6900
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Datein
Das ist mir auch schon aufgefallen, es gibt sehr viele fertige Methoden in FPC/Lazrus, aber wen man diese nicht kennt schreibt man sie meistens selbst.Für uns Nicht-Genies besteht nunmal 90 % der Arbeit beim Programmieren darin, rauszufinden, wie's gehen könnte.
Gutes Beispiel StringOfChar, da hatte ich auch mal selbst geschrieben.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- corpsman
- Lazarusforum e. V.
- Beiträge: 1617
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: Datein
Servus,
an der Plattformunabhängigen File Change Notification hab ich mich mal versucht. Das Ganze ist aber nicht ohne (und deswegen auch noch nicht auf meiner HP).
Du kannst ja mal schaun in wie weit es dir weiter hilft.
an der Plattformunabhängigen File Change Notification hab ich mich mal versucht. Das Ganze ist aber nicht ohne (und deswegen auch noch nicht auf meiner HP).
Du kannst ja mal schaun in wie weit es dir weiter hilft.
- Dateianhänge
-
- cn_monitor.pas
- Plattform unabhägniges Überwachen von Dateien auf deren Änderung.
- (29.26 KiB) 86-mal heruntergeladen
--
Just try it
Just try it
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2805
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: Datein
Wie sollte dass denn deiner Meinung nach formuliert werden? Bzw. wie käme man auf die Idee, dass man die StringListe vorher erstellen könnte?ruewa hat geschrieben: Leider hat sie auch ihre Grenzen, z.B. daß man die Stringliste bei FindAllFiles tunlichst nicht selbst erstellen sollte, steht dort nicht.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Re: Datein
Das ist eine absolute Selbstverständlichkeit. In all meinen Routinen müssen StringListen vorher erstellt werden, es sein denn der Name der Prozedur enthält irgendwas mit "Create..." Andernfalls musst du bei jeder Prozedur, die eine StringListe als parameter enthält, nachsehen, ob vielleicht doch ein Create aufgerufen wurde. Und außerdem ist hier das auch noch eine Funktion, bei der man ja das Funktionsergebnis ignorieren kann - das provoziert Speicherlecks.Bzw. wie käme man auf die Idee, dass man die StringListe vorher erstellen könnte?
- m.fuchs
- Lazarusforum e. V.
- Beiträge: 2805
- Registriert: Fr 22. Sep 2006, 19:32
- OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
- CPU-Target: x86, x64, arm
- Wohnort: Berlin
- Kontaktdaten:
Re: Datein
1.) Es handelt sich hier um eine Funktion.wp_xyz hat geschrieben:Das ist eine absolute Selbstverständlichkeit. In all meinen Routinen müssen StringListen vorher erstellt werden, es sein denn der Name der Prozedur enthält irgendwas mit "Create..." Andernfalls musst du bei jeder Prozedur, die eine StringListe als parameter enthält, nachsehen, ob vielleicht doch ein Create aufgerufen wurde. Und außerdem ist hier das auch noch eine Funktion, bei der man ja das Funktionsergebnis ignorieren kann - das provoziert Speicherlecks.Bzw. wie käme man auf die Idee, dass man die StringListe vorher erstellen könnte?
2.) Sie bekommt keine TStringList als Parameter übergeben.
3.) Sie gibt ein TStringList zurück.
Wie sollte man da auf die Idee kommen, man müsse vorher eine TStringList instanzieren. Wohin will man sie denn übergeben?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
Re: Datein
Hast ja recht. Aber wenn man die Parameter nicht genau im Kopf hat, und wenn man in der Hektik nicht genau hinguckt, dass es gar keinen Parameter für die StringList gibt - so wie ich in meiner Antwort -, entstehen die Fehler, an denen man lange sucht. Es sollte eine Design-Regel beim Umgang mit Klassen geben, dass man Klassen nie in Funktionen und nie als var-Parameter von Prozeduren, sondern nur vor dem Aufruf mit dem eigenen Konstruktor erzeugen sollte. Da kann man dann gucken, ob es zu jedem Create auch ein Free gibt.
Wie lange sucht man an diesem Speicherleck?
Wie lange sucht man an diesem Speicherleck?
Code: Alles auswählen
Listbox.Items.Assign(FindAllFiles('c:\Lazarus'));
//oder:
Memo.Lines := FindAllFiles('c:\Lazarus'); // gefunden im englischen Lazarus-Forum