File, Folder… und jetzt auch File handles!

Mit den Befehlen File und Folder, die in 4D v17 R5 erschienen sind, können Sie Ordner und Dateien auf der Festplatte auf moderne und effiziente Weise verwalten.

Für das Schreiben und Lesen stehen Ihnen die Funktionen setText und getText zur Verfügung, um den gesamten Inhalt zu lesen oder zu schreiben. Aber was tun, wenn Sie eine oder mehrere Zeilen eines bestehenden Dokuments lesen oder hinzufügen möchten? Mit den neuen „File Handles“-Objekten in 4D v19 R7 ist dies einfacher denn je.

Lesen Sie weiter für Details!

HDI Datei-Handles verwenden

Was sind File Handles?

File Handles sind Objekte, die auf der Grundlage von „File“-Objekten erstellt wurden und über Funktionen verfügen, um auf beliebige Teile von Dokumenten zuzugreifen und von dort aus deren Inhalt sequentiell zu lesen oder zu schreiben.

Auch wenn im allgemeinen Fall vom Anfang bis zum Ende gelesen wird, ist es möglich, die Position des „Lesekopfes“ genau zu definieren.

Wenn Sie ein Dokument öffnen wollen, um neue Informationen zu schreiben, befindet sich der „Schreibkopf“ im Allgemeinen am Ende des Dokuments, das Sie schreiben wollen. Sie können den „Schreibkopf“ positionieren, wo immer Sie wollen.

Aber das ist noch nicht alles!

Das wichtigste und bedeutendste Merkmal von File Handle ist, dass es das Öffnen und Schließen von Dokumenten vermeidet, was eine sehr zeitaufwendige Operation ist. Und das Beste daran ist, dass das Schließen von Dateien durch Programmierung nicht mehr zwingend erforderlich ist. Sobald die behandelte Datei nirgendwo in Ihrem Code referenziert wird, wird die Datei automatisch geschlossen! Das ist der Grund, warum, wie wir später sehen werden, keine .close()-Funktion benötigt wird!

Schauen wir uns ein kurzes Beispiel an

Das Ziel ist es, Zeilen zu einer Log-Datei hinzuzufügen. Erstellen wir eine Klasse namens Logger und eine Funktion namens writeLine und sehen wir uns an, wie man sie aufruft!

Class constructor($logName : Text)
	
	var $file : 4D.File
	
	$file:=File("/LOGS/"+$logName)
	$file.parent.create()  // check that parent folder exists; Otherwise it will be created.
	This.fh:=$file.open("append")
	
Function writeLine($logText : Text)
	
	This.fh.writeLine($logText)

Sobald diese Klasse erstellt ist, rufen wir sie auf!

var $logger : cs.Logger
var $logName : Text

$logName:=Replace string(Timestamp; ":"; "-")+".txt"
$logger:=cs.Logger.new($logName)

For ($i; 1; 10)
	$logger.writeLine("test_"+String(Random))
End for 

An dieser Stelle könnten wir die Datei schließen, indem wir das $logger-Objekt auf NULL setzen, aber das ist nicht zwingend notwendig! Am Ende dieses Codes wird der $logger (und sein Attribut .fh) auf NULL gesetzt, sodass die Datei geschlossen wird!

Attribute und Funktionen

Neue Datei Funktion:

Die erste Funktion, open(), ist eine neue Funktion von File, die es ermöglicht, ein Handle zu erstellen. Das Handle kann im Lesemodus, im Schreibmodus oder im Anfügemodus erstellt werden.

$handle:=$file.open("write")

Sie können auch ein Objekt als Parameter verwenden, wenn Sie den Zeichensatz, die Lese- oder Schreibbegrenzer angeben müssen.

$o:=New object()
$o.mode:="append"
$o.charset:="UTF-8"
$o.breakModeRead:=Document with CRLF
$o.breakModeWrite:=Document with CRLF
$handle:=$file.open($o)

Sobald das Handle erstellt ist, sind weitere Attribute und Funktionen verfügbar:

Zwei weitere nützliche Handle-Attribute

  • .offset ist der aktuelle Offset des Datenstroms (Position innerhalb des Dokuments)
    • Dieses Attribut ist beschreibbar. Verwenden Sie es nur, wenn Sie die Lese- oder Schreibposition an einer bestimmten Stelle setzen müssen. Denken Sie daran, dass sich sein Wert nach einer Lese- oder Schreiboperation automatisch ändert.
  • .eof ist falsch, solange das Ende des Dokuments noch nicht erreicht ist.

 

Das .eof-Attribut erlaubt es, eine Datei auf sehr elegante Weise zu durchsuchen

$fileHandle:=$file.open("read")  
While (Not($fileHandle.eof))  // eof = end of file
	$text:=$fileHandle.readLine() 
	//…	
End while 

handle-Funktionen

Die Handle-Klasse verfügt über viele Funktionen, die folgendes ermöglichen:

  • Lesen und Schreiben von Text
  • Zeilen lesen und schreiben (mit automatischer Verwaltung von Zeilenumbrüchen)
  • Die Größe eines Dokuments abfragen und einstellen
  • Blobs lesen und schreiben!

Wie geht es jetzt weiter?

Weitere Details finden Sie im Dokumentationszentrum. Und sprechen Sie uns in den 4D Foren an, wir helfen Ihnen gerne weiter.

Roland Lannuzel
- Product Owner & 4D Experte - Nach seinem Studium der Elektronik arbeitete Roland als Entwickler und Berater in der industriellen IT-Branche, wo er Lösungen für Kunden mit einer Vielzahl von Datenbanken und Technologien entwickelte. In den späten 80er Jahren verliebte er sich in 4D und setzte es bei der Entwicklung von Geschäftsanwendungen wie Buchhaltungs-, Abrechnungs- und E-Mail-Systemen ein. 1997 trat er schließlich in das Unternehmen ein und leistete einen wertvollen Beitrag, indem er Spezifikationen, Testtools und Demos entwarf, Schulungen durchführte und auf vielen Konferenzen für die 4D Community sprach. Er gestaltet die Zukunft von 4D aktiv mit, indem er neue Funktionen und Datenbankentwicklungstools definiert.