Datein

Für Fragen von Einsteigern und Programmieranfängern...
DDKFM
Beiträge: 17
Registriert: Di 23. Sep 2014, 19:32

Datein

Beitrag von DDKFM »

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

Benutzeravatar
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

Beitrag von m.fuchs »

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.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

DDKFM
Beiträge: 17
Registriert: Di 23. Sep 2014, 19:32

Re: Datein

Beitrag von DDKFM »

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.

Benutzeravatar
theo
Beiträge: 10858
Registriert: Mo 11. Sep 2006, 19:01

Re: Datein

Beitrag von theo »

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?

Mathias
Beiträge: 6900
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Datein

Beitrag von Mathias »

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

Benutzeravatar
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

Beitrag von m.fuchs »

DDKFM hat geschrieben:Ich will eine Konsolenanwendung schreiben die im Hintergrund läuft und ständig einen Ordner kontrolliert ob Datein geändert wurden[...]
Dafür gibt es andere Möglichkeiten. Vielleicht hat auch schon jemand eine plattformunabhängige Komponente dafür erstellt.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

ruewa
Beiträge: 153
Registriert: Sa 12. Apr 2014, 14:43

Re: Datein

Beitrag von ruewa »

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
Hallo DDKFM,

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;
Das erspart den ganzen FindFirst / FindNext / FindClose - Kram.
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;
Ich frage mich allerdings, warum Du diese Schwierigkeiten hast, FindFirst etc. zu verstehen. Funktioniert Deine Lazarus-Hilfe nicht? Die Lazarus-Hilfe ist weit mehr als eine "Bedienungsanleitung" für Lazarus, sie enthält sozusagen das ganze "Referenzhandbuch" der Pascal-Methoden. Solange Du das nicht zum Laufen kriegst, kommst Du nicht weit! In der Hilfe findest Du unter "FindFirst" auch ein Beispiel, wie FindFirst / FindNext / FindClose angewendet wird. Normalerweise müßte die Hilfe bei einer Standardinstallation von Lazarus aus dem Stand heraus verfügbar sein, wenn nicht, wäre diese Seite der nächste Anlaufpunkt: http://wiki.freepascal.org/Installing_Help_in_the_IDE

Gruß Rüdiger

DDKFM
Beiträge: 17
Registriert: Di 23. Sep 2014, 19:32

Re: Datein

Beitrag von DDKFM »

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.

ruewa
Beiträge: 153
Registriert: Sa 12. Apr 2014, 14:43

Re: Datein

Beitrag von ruewa »

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.
:wink:

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

Mathias
Beiträge: 6900
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Datein

Beitrag von Mathias »

Für uns Nicht-Genies besteht nunmal 90 % der Arbeit beim Programmieren darin, rauszufinden, wie's gehen könnte.
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.

Gutes Beispiel StringOfChar, da hatte ich auch mal selbst geschrieben.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
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

Beitrag von corpsman »

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.
Dateianhänge
cn_monitor.pas
Plattform unabhägniges Überwachen von Dateien auf deren Änderung.
(29.26 KiB) 86-mal heruntergeladen
--
Just try it

Benutzeravatar
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

Beitrag von m.fuchs »

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.
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?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

wp_xyz
Beiträge: 5130
Registriert: Fr 8. Apr 2011, 09:01

Re: Datein

Beitrag von wp_xyz »

Bzw. wie käme man auf die Idee, dass man die StringListe vorher erstellen könnte?
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.

Benutzeravatar
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

Beitrag von m.fuchs »

wp_xyz hat geschrieben:
Bzw. wie käme man auf die Idee, dass man die StringListe vorher erstellen könnte?
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.
1.) Es handelt sich hier um eine Funktion.
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

wp_xyz
Beiträge: 5130
Registriert: Fr 8. Apr 2011, 09:01

Re: Datein

Beitrag von wp_xyz »

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?

Code: Alles auswählen

 
  Listbox.Items.Assign(FindAllFiles('c:\Lazarus'));
//oder:
  Memo.Lines := FindAllFiles('c:\Lazarus');  // gefunden im englischen Lazarus-Forum
 

Antworten