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
BearbeitenEine 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
BearbeitenDer 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
Bearbeitendir = 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
BearbeitenBei 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
BearbeitenEin 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.