Programmierung in Ruby

Der Leitfaden der Pragmatischen Programmierer

class File
Parent: IO
Version: 1.6

Index:

atime basename chmod chown ctime delete dirname expand_path ftype join link lstat mtime new open readlink rename size split stat symlink truncate umask unlink utime atime chmod chown ctime flock lstat mtime path truncate


Ein File ist eine Abstraktion eines beliebigen Datei-Objekts, auf das das Programm zugreifen soll. Es ist eng verwandt mit der Klasse IO (vgl. dieser Abschnitt). File schließt die Methoden des Moduls FileTest als Klassen-Methoden ein, so dass z.B. File.exist?("foo") ein erlaubter Ausdruck ist.

In dieser Sektion stellen permission bits einen Plattform-spezifischen Satz von Bits, die die Zugriffsrechte auf einer Datei definieren. Auf Unix-basierten Systemen werden Zugriffsrechte als ein Satz von drei Octets betrachtet, je eines für den Besitzer, die Gruppe und den Rest der Welt. Jeder dieser Entitäten kann das Lesen, Schreiben oder Ausführen (bzw. Durchsuchen im Falle eines Verzeichnisses) der Datei erlaubt werden.

Besitzer Gruppe Andere
r w x r w x r w x
4 2 1 4 2 1 4 2 1

Der permission bit-Satz 0644 (in oktaler Notierung) würde folglich folgende Auswirkungen haben: Lese-/Schreibrechte für den Besitzer, Lesezugriff für Gruppenangehörige und Andere. Bits höherer Ordnung können verwendet werden, um den Dateityp zu bestimmen (einfach, Verzeichnis, pipe, socket usw.) oder verschiedene andere Zwecke zu bestimmen.

Auf nicht-Posix Betriebssystemen könnte es lediglich möglich sein, eine Datei nur zum Lesen freizugeben bzw. nicht. In diesem Fall werden die übrigen permission bits synthetisiert, so dass typsiche Werte übergeben werden. Zum Beispiel sind die Vorgabewerte unter Windows NT 0644, d.h. Lese-/Schreibrechte für den Besitzer und nur-Lesen für alle Anderen. Die einzig mögliche Änderung besteht, darin, die Schreibrechte auf der Datei wegzunehmen, so dass dann 0444 für die permission bits ausgegeben wird.
mixins
FileTest: blockdev?, chardev?, directory?, executable?, executable_real?, exist?, exists?, file?, grpowned?, owned?, pipe?, readable?, readable_real?, setgid?, setuid?, size, size?, socket?, sticky?, symlink?, writable?, writable_real?, zero?

Pfad Separator Konstanten (Plattform-spezifisch)

ALT_SEPARATOR Alternativer Pfad Separator.
PATH_SEPARATOR Das Zeichen, das die Dateinamen in einem Suchpfad trennt (zum Beispiel ``:'' oder ``;'').
SEPARATOR Das Zeichen, das Verzeichnis-Elemente in einem Dateinamen separiert (zum Beispiel ``\'' oder ``/'').
Separator Alias für SEPARATOR.

Öffnungs-Modi Konstanten

APPEND Öffnet eine Datei im Append-Modus; alle Schreibzugriffe erfolgen am Ende der Datei.
CREAT Erstelle eine neue Datei beim öffnen, wenn sie noch nicht existiert.
EXCL Gemeinsam mit CREAT benutzt, ist open bei bestehendem Dateinamen nicht erfolgreich.
NOCTTY Wenn ein Terminal-Endgerät geöffnet wird (vgl. hierzu IO#isatty in diesem Abschnitt), wird dieses nicht das Kontroll-Terminal.
NONBLOCK Öffnet die Datei im Nicht-blockierenden Modus.
RDONLY Öffnet die Datei ausschließlich zum Lesezugriff.
RDWR Öffnet die Datei für Lese- und Schreibzugriffe.
TRUNC Öffnet die Datei und kürzt sie auf Null-Länge, wenn sie existiert.
WRONLY Öffnet die Datei ausschließlich zum Schreibzugriff.

class methods
atime File.atime( dateiName ) -> eineZeit

Gibt den Zeitpunkt des letzten Dateizugriffs (access time, d.Red.) zurück.

File.atime("testfile") » Sun Mar 04 23:25:54 CST 2001

basename File.basename( dateiName[, einSuffix] ) -> einNeuerString

Gibt das letzte Element des in dateiName übergebenen Dateinamens zurück. Dieser muss mit nach vorn geneigten Strichen geformt werden (``/''), und zwar unabhängig vom Separator, der im lokalen dateisystem benutzt wird. Wenn einSuffix angegeben wird und dieses auch am Ende des Dateinamens steht, wird es entfernt.

File.basename("/home/gumby/work/ruby.rb") » "ruby.rb"
File.basename("/home/gumby/work/ruby.rb", ".rb") » "ruby"

chmod File.chmod( einModusInt[, dateiName]+ ) -> einInteger

Ändert die Zugriffsrechte für die angegebene(n) Datei(en) entsprechend den permission bits, die in einModusInt übergeben werden. Die Ausführung erfolgt system-spezifisch (vgl. Anfang dieses Abschnitts). Unter Unix-Systemen siehe auch chmod(2) für weitere Details. Die Zahl der geänderten Dateien wird zurückgegeben.

File.chmod(0644, "testfile", "out") » 2

chown File.chown( einBesitzerInt, eineGruppeInt[, dateiName]+ ) -> einInteger

Ändert den Besitzer und die Gruppe für die angegebene(n) Datei(en) auf die übergebene numerischen Besitzer-Id und Gruppen-Id. Nur Prozesse mit dem superuser-Privileg können den Besitzer einer Datei wechseln. Der aktuelle Besitzer darf die Gruppe der Datei auf jede der Gruppen setzen, denen er selbst angehört. Ein Wert von nil oder -1 für Besitzer-Id oder Gruppen-Id wird ignoriert. Die Methode gibt die Anzahl der bearbeiteten Dateien zurück.

File.chown(nil, 100, "testfile")

ctime File.ctime( dateiName ) -> eineZeit

Gibt den Zeitpunkt zurück, an dem die Datei zum letzten Mal geändert (change time, d.Red.) wurde (genau genommen der Zeitpunkt, an dem die Verzeichnisinformation über die Datei geändert wurde, nicht die Datei selbst).

File.ctime("testfile") » Sun Mar 04 23:28:25 CST 2001

delete File.delete( [dateiName]+ ) -> eineFixnum

Löscht die benannte(n) Datei(en). Gibt die ANzahl der bearbeiteten Dateien zurück. Siehe auch Dir.rmdir.

File.new("testrm", "w+").close » nil
File.delete("testrm") » 1

dirname File.dirname( dateiName ) -> dateiName

Gibt alle Komponenten des Dateinamens in dateiName ausser den letzten zurück. Der Dateiname muss unter Verwendung von vorwärts Schrägstrichen (``/'') gebildet sein, und zwar unabhängig vom im lokalen System verwendeten Separator.

File.dirname("/home/gumby/work/ruby.rb") » "/home/gumby/work"

expand_path File.expand_path( dateiName[, einDirString] ) -> dateiName

Konvertiert einen Pfad in eine absolute Pfadangabe. Relative Pfadangaben werden aus dem aktuellen Arbeitsverzeichnis referenziert, wenn einDirString nicht als Ausgangspunkt mitgegeben wird. Der angegebene Pfadname kann mit einem ``~'' beginnen, so dass ausgehend vom Stammverzeichnis des Prozess-Besitzers weiter verzweigt wird (dazu muss die Umgebungsvariable HOME korrekt gesetzt sein). ``~user'' setzt beim Stammverzeichnis des genannten Benutzers an.

File.expand_path("~oracle/bin") » "/home/oracle/bin"
File.expand_path("../../bin", "/tmp/x") » "/bin"

ftype File.ftype( dateiName ) -> fileTyp

Identifizerit den Typ der genannten (logischen) Datei. Es wird einer der folgenden Strings zurückgegeben: ``file'' (normale Datei, d.Red.), ``directory'' (Verzeichnis, d.Red.), ``characterSpecial'' (Hardwarekomponenten, sog. character devices, wie z.B. Bildschirme oder Drucker d.Red.), ``blockSpecial'' (Hardwarekomponenten, sog. block devices, wie z.B. Festplatten, Massenspeicher d.Red.), ``fifo'' (Pipes, die der Interprozesskommunikation dienen sind FIFO-Stacks, d.Red.), ``link'' (symbolischer Link, der z.B. für Aliases unter linux/unix eingesetzt wird, d.Red.) oder ``socket'' (Socketverbindungen, d.Red.).

File.ftype("testfile") » "file"
File.ftype("/dev/tty") » "characterSpecial"
File.ftype("/tmp/.X11-unix/X0") » "socket"

join File.join( [einString]+ ) -> dateiName

Gibt einen neuen String zurück, der aus den Strings mit Hilfe von File::SEPARATOR gebildet wird (vgl. Tabelle 22.2).

File.join("usr", "mail", "gumby") » "usr/mail/gumby"

link File.link( einAlterName, einNeuerName ) -> 0

Erstellt einen neuen Namen für eine bestehende Datei mit einem harten Link. Die Methode überschreibt aNewName nicht, wenn dieser bereits existiert (es wird dann eine Unterklasse von SystemCallError werfen). Die Methode ist nicht auf allen Plattformen verfügbar.

File.link("testfile", ".testfile") » 0
IO.readlines(".testfile")[0] » "This is line one\n"

lstat File.lstat( dateiName ) -> einStat

Dieselbe Methode wie IO#stat. Folgt jedoch nicht dem letzten symbolischen Link, sondern gibt den Link zurück.

File.symlink("testfile", "link2test") » 0
File.stat("testfile").size » 66
File.lstat("link2test").size » 8
File.stat("link2test").size » 66

mtime File.mtime( dateiName ) -> eineZeit

Die Methode gibt den Zeitpunkt der letzten Änderung zurück (modification time, d.Red.).

File.mtime("testfile") » Tue Feb 27 00:11:18 CST 2001

new File.new( dateiName, einModusString="r" ) -> file
File.new( dateiName[, eineModusNum[einePermNum]] ) -> file

Öffnet die in dateiName benannte Datei in dem mit einModusString bezeichneten Modus (Voreinstellung ist ``r'') und gibt ein neues File-Objekt zurück. Vgl. Tabelle 22.5 für eine Beschreibung von aModeString. Der Dateimodus kann optional in einer Fixnum durch ver-oder-ung der in Tabelle 22.3 beschriebenen Flags bestimmt werden. Optionale permission bits können in einePermNum übergeben werden. Die Modus- und Zugriffsrechte-Bits sind Plattform-abhängig; unter Unix, vgl. open(2) für Details.

f = File.new("testfile", "r")
f = File.new("newfile",  "w+")
f = File.new("newfile", File::CREAT|File::TRUNC|File::RDWR, 0644)

open File.open( dateiName, einModusString="r" ) -> file
File.open( dateiName[, eineModusNum[einePermNum]] ) -> file
File.open( dateiName, einModusString="r" ) {| file | block }-> nil
File.open( dateiName[, eineModusNum[einePermNum]] ) {| file | block }-> nil

Wenn kein zugehöriger Codeblock definiert ist, ist open ein Synonym für File.new. Wenn der optionale Codeblock angegeben ist, wird ihm file als Argument übergeben. Die Datei wird in diesem Fall automatisch geschlossen, wenn der Codeblock endet. In dieser Instanz gibt File.opennil zurück.

readlink File.readlink( dateiName ) -> dateiName

Gibt den angegebenen symbolischen Link als String zurück. Dei Methode steht nicht auf allen Plattformen zur Verfügung.

File.symlink("testfile", "link2test") » 0
File.readlink("link2test") » "testfile"

rename File.rename( einAlterName, einNeuerName ) -> 0

Bennent die angegebene Datei mit dem neuen Namen. Wirft einen SystemCallError wenn die Datei nicht umbenannt werden kann.

File.rename("afile", "afile.bak") » 0

size File.size( dateiName ) -> einInteger

Gibt die Dateigröße in Bytes zurück.

File.size("testfile") » 66

split File.split( dateiName ) -> einArray

Teilt den angegebenen String in die Verzeichnis- und die Datei-Komponente und gibt sie in einem 2-Elemente Array zurück. Siehe auch File.dirname und File.basename.

File.split("/home/gumby/.profile") » ["/home/gumby", ".profile"]

stat File.stat( dateiName ) -> einStat

Gibt ein File::Stat-Objekt für die genannte Datei (vgl. File::Stat).

File.stat("testfile").mtime » Tue Feb 27 00:11:18 CST 2001

symlink File.symlink( einAlterName, einNeuerName ) -> 0 oder nil

Erstellt einen symbolischen Link, der einNeuerName heisst, für die existierende Datei einAlterName. Die Methode gibt nil auf allen Plattformen zurück, die symbolische Links nicht unterstützen.

File.symlink("testfile", "link2test") » 0

truncate File.truncate( dateiName, einInteger ) -> 0

Schneidet die Datei dateiName so ab, dass sie etwa einInteger Bytes lang ist. Die Methode steht nicht auf allen Plattformen zur Verfügung.

f = File.new("out", "w")
f.write("1234567890") » 10
f.close » nil
File.truncate("out", 5) » 0
File.size("out") » 5

umask File.umask( [einInteger] ) -> einInteger

Gibt den aktuellen Wert von umask für diesen Prozess zurück. Wenn das optionale Argument definiert ist, wird umask auf dessen Wert gesetzt, sowie der vorherige Wert zurückgegeben. Umask Werte werden von den Standard-Zugriffsrechten abgezogen; eine umask von 0222 würde folglich jedem (Besitzer, Gruppe und Allen) nur Leserechte auf eine Datei geben. Siehe auch die Diskussion über Zugriffsrechte in diesem Abschnitt.

File.umask(0006) » 18
File.umask » 6

unlink File.unlink( [dateiName]+ ) -> einInteger

Synonym für File.delete. Siehe auch Dir.rmdir.

utime File.utime( eineZugriffsZeit, eineModusZeit[, dateiName]+ ) -> eineFixnum

Ändert die Zugriffs- und Änderungszeiten für mehrere Dateien. Die Zeitangaben müssen Instanzen der Klasse Time oder Ganzzahlen sein, die die Anzahl der Sekunden der Epoche darstellen (vgl. hierzu die Klasse Time. Gibt die Anzahl der bearbeiteten Dateien zurück. Die Methode steht nicht auf jeder Plattform zur Verfügung.

File.utime(0, 0, "testfile") » 1
File.mtime("testfile") » Wed Dec 31 18:00:00 CST 1969
File.utime(0, Time.now, "testfile") » 1
File.mtime("testfile") » Sun Mar 04 23:28:25 CST 2001

Sperr-Modus Konstanten

LOCK_EX Exclusive Sperrung. Lediglich ein Prozess kann zu einem bestimmten Zeitpunkt eine exklusive Sperrung für einen bestimmte Datei erhalten.
LOCK_NB Sperre ohne Blockierung. Diese Option kann unter Verwendung eines logischen ODER mit anderen Sperr-Konstanten verknüpft werden.
LOCK_SH Geteilte Sperrung. Mehrere Prozesse können gleichzeitig jeweils eine Sperrung für eine bestimmte Datei erhalten.
LOCK_UN Entsperrung.

instance methods
atime file.atime -> eineZeit

Gibt den Zeitpunkt des letzten Zugriffs auf file zurück bzw. Epoche wenn auf file bisher nicht zugegriffen wurde.

File.new("testfile").atime » Wed Dec 31 18:00:00 CST 1969

chmod file.chmod( eineModusInt ) -> 0

Ändert die permission bits auf file in die in eineModusInt vorgegebenen Werte. Die tatsächlichen Auswirkungen sind Plattform-abhängig; unter Unix, vgl. chmod(2) für Details. Siehe auch die Diskussion von Zugriffsrechten weiter oben in diesem Abschnitt.

f = File.new("out", "w");
f.chmod(0644) » 0

chown file.chown( eineBesitzerId, eineGruppenId ) -> 0

Ändert den Eigentümer sowie die Gruppe von file in die vorgegebenen (numerischen) Werte. Die Methode kann nur von Prozessen mit superuser-Privilegien angewendet werden. Der aktuelle Besitzer der Datei kann die Gruppenzugehörigkeit zu jeder Gruppe bestimmen, der er selbst angehört. Ein Wert von nil bzw. -1 für BesitzerId oder GruppenId wird ignoriert.

File.new("testfile").chown(502, 1000)

ctime file.ctime -> eineZeit

Gibt den Zeitpunkt der letzten Änderung an file zurück (d.h., der Zeitpunkt, an dem die Verzeichnis-Information über die Datei geändert wurde, nicht die Datei selbst).

File.new("testfile").ctime » Sun Mar 04 23:28:25 CST 2001

flock file.flock ( eineSperrKonstante ) -> 0 oder false

Sperrt bzw. entsperrt eine Datei abhängig von eineSperrKonstante (eine logische ODER-Verknüpfung der Werte aus Tabelle 22.4 weiter unten). Die Methode gibt false zurück, wenn File::LOCK_NB angegeben wurde und die Operation anderenfalls blockiert worden wäre. Die Methode steht nicht auf allen Plattformen zur Verfügung.

File.new("testfile").flock(File::LOCK_UN) » 0

lstat file.lstat -> einStat

Dieselbe Methode wie IO#stat. Jedoch wird dem letzten symbolischen Link im Pfad nicht gefolgt, sondern der link selbst wird übergeben.

File.symlink("testfile", "link2test") » 0
File.stat("testfile").size » 66
f = File.new("link2test")
f.lstat.size » 8
f.stat.size » 66

mtime file.mtime -> eineZeit

Gibt den Zeitpunkt der letzten Modifikation für file zurück.

File.new("testfile").mtime » Sun Mar 04 23:28:25 CST 2001

path file.path -> dateiName

Gibt den Pfadnamen zurück, der benötigt wird, um file als einen String anzugeben.

File.new("testfile").path » "testfile"

truncate file.truncate( einInteger ) -> 0

Schneidet file bei ungefähr einInteger Bytes ab. Die Datei muss für den Schreibzugriff geöffnet sein. Die Methode steht nicht auf allen Plattformen zur Verfügung.

f = File.new("out", "w")
f.syswrite("1234567890") » 10
f.truncate(5) » 0
f.close() » nil
File.size("out") » 5


Extracted from the book "Programming Ruby - The Pragmatic Programmer's Guide"
Übersetzung: Carsten Schinzer
Für das englische Original:
© 2000 Addison Wesley Longman, Inc. Released under the terms of the Open Publication License V1.0. That reference is available for download.
Diese Lizenz sowie das Original vom Herbst 2001 bilden die Grundlage der Übersetzung
Es wird darauf hingewiesen, dass sich die Lizenz des englischen Originals inzwischen geändert hat.
Für die deutsche Übersetzung:
© 2002 Jürgen Katins
Der Copyright-Eigner stellt folgende Lizenzen zur Verfügung:
Nicht-freie Lizenz:
This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0 or later (the latest version is presently available at http://www.opencontent.org/openpub/). Distribution of substantively modified versions of this document is prohibited without the explicit permission of the copyright holder. Distribution of the work or derivative of the work in any standard (paper) book form is prohibited unless prior permission is obtained from the copyright holder.
Freie Lizenz:
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".