Ruby-Programmierung: Dateien

Zurück zum Inhaltsverzeichnis.

Beim Zugriff auf Dateien stellt Ruby einen manchmal vor Probleme. Zum einen liefert es ein sehr elegantes Interface für das einfache Lesen und Schreiben, bei spezielleren Anwendungen befindet man sich näher an den zugrunde liegenden C-Bibliotheken, die nicht mehr den Konventionen von Ruby folgen. Außerdem ist es an dieser Stelle nicht mehr möglich, ohne die Vorwegnahme von Teilen der Objektorientierung auszukommen.

Ausgabe des eigenen Quelltextes Bearbeiten

Eine einfache Aufgabe eines Programms im Umgang mit Dateien ist es, den eigenen Quelltext auszugeben. Es muss sich also selber öffnen, lesen, ausgeben und wieder schließen. Die besondere globale Variable $0 oder $PROGRAM_NAME enthält den Skriptnamen.

source = open($PROGRAM_NAME, "r")
puts source.read
source.close

Dateien muss man sich anders vorstellen, als bisherige Datentypen. Sie sind sogenannte Streams, das heißt beim Öffnen einer Datei wird ein Stream angelegt, auf den danach zugegriffen werden kann. Erst beim Lesen mit read oder gets wird der Stream in einen String umgewandelt. Diese Eigenschaft von Streams zeigt sich insbesondere, wenn man mehrmalig aus einer Datei lesen möchte. Ergänzen Sie das Skript um eine zweite Zeile puts source.read, dann werden Sie feststellen, dass die neue Zeile zwar in der Ausgabe vorkommt, das gesamte Skript jedoch nur einmal ausgegeben wird. Der Stream wird nämlich ausgelesen und ist danach leer. Vor dem zweiten Auslesen muss der Stream zurückgesetzt werden, dies erfolgt mit der Methode source.rewind.

Schließlich soll noch die folgende Syntax kurz erläutert werden.

source.read

Die Methode read wirkt dabei auf die davor stehen Variable und liest sie in dem Fall aus. Diese Form von Methoden traten bereits früher in Form von Hash#each und String#+ auf. Das ist ein Vorgriff auf den folgenden Teil über Objektorientierung. Man kann sich vorstellen, dass es sich um eine Methode handelt, deren erstes Argument die Variable source ist.

Rechte Bearbeiten

Der zweite Parameter der Methode open legt die Zugriffsrechte auf den Stream fest.

Parameter Erklärung
"r" Default: Erlaubt das Lesen des Streams.
"w" Erlaubt das Schreiben des Streams. Beim Schreiben wird der alte Inhalt überschrieben.
"a" Erlaubt ebenfalls das Schreiben. Der Inhalt wird jedoch angehängt.

Das Schreiben in eine Datei erfolgt mit File#puts.

Auflistung eines Verzeichnis Bearbeiten

dir = Dir.open("./")
dir.each do |file_or_directory|
  puts file_or_directory
end  

dir.close

Jedes Verzeichnis enthält die Verzeichnisse . und ... Sie stehen für das aktuelle Verzeichnis und das übergeordnete Verzeichnis. Beim Öffnen eines Verzeichnisses wird im Gegensatz zu einer Datei ein Array aus Dateinamen erzeugt. Daher ist es eventuell nötig vor dem Öffnen zu prüfen, ob eine Datei existiert und ob es sich nicht um ein Verzeichnis handelt.

Verzeichnisse und Dateien Bearbeiten

Bei Verzeichnispfaden verwendet Ruby als Separator zwischen Verzeichnis und Unterverzeichnis den Schrägstrich / unabhängig vom eingesetzten Separator des Betriebssystems.

Zum Überprüfen, ob eine Datei vorhanden ist, dient die Methode File#exist?. Dabei wird nicht zwischen Verzeichnissen und Dateien unterschieden, dafür dient die Methode File#file?.

DATA Bearbeiten

Ein Quelltext in Ruby wird begrenzt durch das Ende der Datei oder der Zeile __END__. Es ist möglich danach Daten zu hinterlegen. In der Konstante DATA ist eine Datei hinterlegt, sodass der Lesezeiger auf die erste Zeile nach __END__ steht. Dadurch ist es möglich in kleinen Skripten Daten direkt in den Quelltext einzubauen und sehr einfach zu lesen.

puts DATA.read

__END__
Hello World!

Dadurch, dass es sich um eine ganz normale Datei handelt, der eigene Quelltext, ist es auch möglich die üblichen Dateioperationen darauf auszuführen. Dadurch ist es wie folgt Möglich den Quelltext auf etwas kryptische Art und Weise auszugeben.

DATA.rewind
puts DATA.read
__END__

Die Konstante DATA wird nur beim Vorhandensein von __END__ definiert, so ist die letzte Zeile im obigen Skript zwingend erforderlich.