Lazarus/Dateien: Unterschied zwischen den Versionen

Aus ZUM-Unterrichten
(Navigation)
(formatiert)
Markierung: 2017-Quelltext-Bearbeitung
 
(8 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Lazarus-Buch}}
== Allgemeines zu Dateien ==
== Allgemeines zu Dateien ==


Zeile 5: Zeile 4:


== Lesen von Schreiben von Daten in Dateien ==
== Lesen von Schreiben von Daten in Dateien ==
Wir betrachten nun, wie Programme selbst Dateien erstellen, Daten hineinschreiben und Daten herauslesen können. Wir beschränken uns dabei hier auf reine Text-Dateien, also Dateien, in denen die Daten auch in menschenlesbarer Form abgelegt sind.
Um Textdateien manipulieren zu können, gibt es einen neuen Variablentyp <tt>TextFile</tt>. Die folgenden Befehle sind hierfür verfügbar:
{| class ="wikitable toptextcells"
! Befehl
! Bedeutung
|-
| AssignFile(Datei,Dateiname)|| Verbindet die <tt>Datei</tt> vom Typ <tt>TextFile</tt> mit der Datei mit dem angegebenen <tt>Dateinamen</tt>.
|-
| Rewrite(Datei)|| Öffnet die Datei zum (Über-)Schreiben. Die bisher enthaltenen Daten werden gelöscht.
|-
| Reset(Datei)|| Öffnet die Datei zum Lesen.
|-
| Append(Datei)|| Öffnet die Datei zum Anhängen zusätzlicher Daten
|-
| EOF(Datei) || Diese Funktion (Abkürzung für "End of File") liefert <tt>true</tt>, wenn das Ende der Datei erreicht ist, wenn also keine weiteren Daten mehr kommen.
|-
| Readln(Datei,Variable)|| Liest eine Variable (String, Integer, Double) aus der Datei aus.
|-
| Writeln(Datei,Variable)|| Schreibt eine Variable (String, Integer, Double) in die Datei.
|-
| CloseFile(Datei)|| Schließt die Datei. <br> Am Ende des Programms oder der Dateimanipulation nicht vergessen, sonst können Daten verloren gehen.
|-
|}
<source  line lang="pascal">
unit Dateitest_main;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
  { TForm1 }
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
var
  Form1: TForm1;
  Datei : TextFile;
  s : string;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
  AssignFile(Datei,'MeineDatei.txt');
  Rewrite(Datei);
  writeln(Datei,'Hallo');
  writeln(Datei,'Welt');
  CloseFile(Datei);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  AssignFile(Datei,'MeineDatei.txt');
  Append(Datei);
  writeln(Datei,'Hallo');
  writeln(Datei,'Welt');
  CloseFile(Datei);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
  AssignFile(Datei,'MeineDatei.txt');
  Reset(Datei);
  Memo1.Lines.Clear;
  while not eof(Datei)
  do begin
    readln(Datei,s);
    Memo1.Lines.Add(s);
    end;
  CloseFile(Datei);
end;
end.
</source>


== Manipulation von Dateien und Ordnern als Ganzes ==
== Manipulation von Dateien und Ordnern als Ganzes ==
Für alle folgenden Befehle muss die Unit <tt>sysutils</tt> in der<tt> uses ...</tt>-Klasel eingebunden werden, was standardmäßig auch der Fall ist. Näheres zu dieser Unit, die noch sehr viele andere nützliche Befehle enthält, findet sich auf den Dokumentationsseiten zu [http://lazarus-ccr.sourceforge.net/docs/rtl/sysutils/ systutils] des Lazarus-Projekts.




Zeile 16: Zeile 116:
! Bedeutung
! Bedeutung
|-  
|-  
|DeleteFile  ||  
|DeleteFile(Dateiname : String) : Boolean || Löscht die Datei mit dem gegebenen Dateiname. <br/> Liefert "false" zurück, wenn die Datei nicht gelöscht werden kann.
|-  
|-  
|RenameFile  ||  
|RenameFile(AlterName, NeuerName : String) : Boolean || Benennt eine Datei um. <br/> Liefert "false" zurück, wenn die Datei nicht umbenannt werden kann.
|-  
|-  


|}
|}


=== Löschen, Umbenennen und Erzeugen von Ordnern ===
=== Löschen, Umbenennen und Erzeugen von Ordnern ===
{| class ="wikitable toptextcells"  
{| class ="wikitable toptextcells"  
! Befehl
! Befehl
! Bedeutung
! Bedeutung
|-  
|-  
|RemoveDir  ||  
|RemoveDir(Ordnername : String) : Boolean || Löscht den angegebenen Ordner. <br/> Liefert "false" zurück, wenn der Ordner nicht gelöscht werden kann.
|-  
|-  
|RenameFile  ||  
|RenameFile(Ordnername : String) : Boolean || Benennt den angegebenen Ordner um. <br/> Liefert "false" zurück, wenn der Ordner nicht umbenannt werden kann.
|-  
|-  
|ForceDirectories  ||  
|ForceDirectories(Pfadname : String) : Boolean || Erzeugt den gesamten angegebenen Pfad. <br/> Liefert "false" zurück, wenn das nicht möglich ist.
|-  
|-  
|}
|}


=== Überprüfen der Existenz von Dateien und Ordnern ===
=== Überprüfen der Existenz von Dateien und Ordnern ===
Zeile 47: Zeile 142:
! Bedeutung
! Bedeutung
|-  
|-  
|FileExists||  
|FileExists(Dateiname : String) : Boolean || Liefert "true" zurück, wenn die Datei mit dem angegebenen Namen existiert.
|-  
|-  
|DirectoryExists  ||  
|DirectoryExists(Ordnername: String) : Boolean || Liefert "true" zurück, wenn der Ordner mit dem angegebenen Namen existiert.
|-  
|-  
|}
|}
Zeile 55: Zeile 150:


=== Dateinamen und Pfade ===
=== Dateinamen und Pfade ===
In Microsoft-Windows besteht ein (vollständiger) Dateiname wie <tt><nowiki>C:\Programme\lazarus\bin\lazarus.exe</nowiki> </tt> aus verschiedenen Bestandteilen:
* Dem Laufwerk (<tt><nowiki>C</nowiki></tt>)
* Dem Dateipfad (<tt><nowiki>C:\Programme\lazarus\bin\</nowiki></tt>) <br> bzw. dem Dateiordner (<tt><nowiki>C:\Programme\lazarus\bin</nowiki></tt>)
* Dem eigentlichen Dateimnamen (<tt><nowiki>lazarus.exe</nowiki></tt>)
* Der Dateiendung (<tt><nowiki>exe</nowiki></tt>)
{| class ="wikitable toptextcells"  
{| class ="wikitable toptextcells"  
! Befehl
! Befehl
! Bedeutung
! Bedeutung
|-  
|-  
|ExtractFileDrive||  
|ExtractFileDrive(vollst_Dateiname : String) : String || Liefert das Laufwerk zurück
|-  
|-  
|ExtractFilePath||  
|ExtractFilePath(vollst_Dateiname : String) : String || Liefert den Dateipfad zurück
|-  
|-  
|ExtractFileName||  
|ExtractFileDir(vollst_Dateiname : String) : String || Liefert den Dateiordner zurück
|-  
|-  
|ExtractFileExt||  
|ExtractFileName(vollst_Dateiname : String) : String || Liefert den eigentlichen Dateinamen zurück
|-
|ExtractFileExt(vollst_Dateiname : String) : String || Liefert die Endung zurück
|-  
|-  
|}
|}
{{Lazarus-Buch}}

Aktuelle Version vom 10. August 2019, 06:25 Uhr

Allgemeines zu Dateien

Während ein Programm läuft, kann man die notwendigen Daten in Variablen des Programms speichern -- wenn es allzu viele sind. Was aber wird aus den Daten, wenn man das Programm beendet. In der Regel sind diese Daten danach verloren, wenn man nicht dafür sorgt, dass sie erhalten bleiben. Eine Möglichkeiten zum dauerhaften Speichern von Daten (über die Laufzeit des Programms hinaus) sind Dateien. Jeder von uns kennt etwa Dateien aus der Textverarbeitung. Und natürlich auch vom Programmieren selbst.

Lesen von Schreiben von Daten in Dateien

Wir betrachten nun, wie Programme selbst Dateien erstellen, Daten hineinschreiben und Daten herauslesen können. Wir beschränken uns dabei hier auf reine Text-Dateien, also Dateien, in denen die Daten auch in menschenlesbarer Form abgelegt sind.

Um Textdateien manipulieren zu können, gibt es einen neuen Variablentyp TextFile. Die folgenden Befehle sind hierfür verfügbar:

Befehl Bedeutung
AssignFile(Datei,Dateiname) Verbindet die Datei vom Typ TextFile mit der Datei mit dem angegebenen Dateinamen.
Rewrite(Datei) Öffnet die Datei zum (Über-)Schreiben. Die bisher enthaltenen Daten werden gelöscht.
Reset(Datei) Öffnet die Datei zum Lesen.
Append(Datei) Öffnet die Datei zum Anhängen zusätzlicher Daten
EOF(Datei) Diese Funktion (Abkürzung für "End of File") liefert true, wenn das Ende der Datei erreicht ist, wenn also keine weiteren Daten mehr kommen.
Readln(Datei,Variable) Liest eine Variable (String, Integer, Double) aus der Datei aus.
Writeln(Datei,Variable) Schreibt eine Variable (String, Integer, Double) in die Datei.
CloseFile(Datei) Schließt die Datei.
Am Ende des Programms oder der Dateimanipulation nicht vergessen, sonst können Daten verloren gehen.
unit Dateitest_main;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 

var
  Form1: TForm1; 
  Datei : TextFile;
  s : string;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  AssignFile(Datei,'MeineDatei.txt');
  Rewrite(Datei);
  writeln(Datei,'Hallo');
  writeln(Datei,'Welt');
  CloseFile(Datei);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  AssignFile(Datei,'MeineDatei.txt');
  Append(Datei);
  writeln(Datei,'Hallo');
  writeln(Datei,'Welt');
  CloseFile(Datei);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  AssignFile(Datei,'MeineDatei.txt');
  Reset(Datei);
  Memo1.Lines.Clear;
  while not eof(Datei)
  do begin
     readln(Datei,s);
     Memo1.Lines.Add(s);
     end;
  CloseFile(Datei);
end;

end.

Manipulation von Dateien und Ordnern als Ganzes

Für alle folgenden Befehle muss die Unit sysutils in der uses ...-Klasel eingebunden werden, was standardmäßig auch der Fall ist. Näheres zu dieser Unit, die noch sehr viele andere nützliche Befehle enthält, findet sich auf den Dokumentationsseiten zu systutils des Lazarus-Projekts.


Löschen, Umbenennen und Erzeugen von Dateien

Ist erst einmal eine Datei erstellt, so kann es sein, dass sie irgendwann nicht mehr gebraucht wird und daher gelöscht werden soll. Oder aber der Name der Datei soll geändert werden. Hierzu kann man die folgenden beiden Befehle verwenden:

Befehl Bedeutung
DeleteFile(Dateiname : String) : Boolean Löscht die Datei mit dem gegebenen Dateiname.
Liefert "false" zurück, wenn die Datei nicht gelöscht werden kann.
RenameFile(AlterName, NeuerName : String) : Boolean Benennt eine Datei um.
Liefert "false" zurück, wenn die Datei nicht umbenannt werden kann.

Löschen, Umbenennen und Erzeugen von Ordnern

Befehl Bedeutung
RemoveDir(Ordnername : String) : Boolean Löscht den angegebenen Ordner.
Liefert "false" zurück, wenn der Ordner nicht gelöscht werden kann.
RenameFile(Ordnername : String) : Boolean Benennt den angegebenen Ordner um.
Liefert "false" zurück, wenn der Ordner nicht umbenannt werden kann.
ForceDirectories(Pfadname : String) : Boolean Erzeugt den gesamten angegebenen Pfad.
Liefert "false" zurück, wenn das nicht möglich ist.

Überprüfen der Existenz von Dateien und Ordnern

Befehl Bedeutung
FileExists(Dateiname : String) : Boolean Liefert "true" zurück, wenn die Datei mit dem angegebenen Namen existiert.
DirectoryExists(Ordnername: String) : Boolean Liefert "true" zurück, wenn der Ordner mit dem angegebenen Namen existiert.


Dateinamen und Pfade

In Microsoft-Windows besteht ein (vollständiger) Dateiname wie C:\Programme\lazarus\bin\lazarus.exe aus verschiedenen Bestandteilen:

  • Dem Laufwerk (C)
  • Dem Dateipfad (C:\Programme\lazarus\bin\)
    bzw. dem Dateiordner (C:\Programme\lazarus\bin)
  • Dem eigentlichen Dateimnamen (lazarus.exe)
  • Der Dateiendung (exe)


Befehl Bedeutung
ExtractFileDrive(vollst_Dateiname : String) : String Liefert das Laufwerk zurück
ExtractFilePath(vollst_Dateiname : String) : String Liefert den Dateipfad zurück
ExtractFileDir(vollst_Dateiname : String) : String Liefert den Dateiordner zurück
ExtractFileName(vollst_Dateiname : String) : String Liefert den eigentlichen Dateinamen zurück
ExtractFileExt(vollst_Dateiname : String) : String Liefert die Endung zurück