Programmierung in Ruby

Der Leitfaden der Pragmatischen Programmierer

class Dir
Parent: Object
Version: 1.6

Index:

[ ] chdir chroot delete entries foreach getwd glob mkdir new open pwd rmdir unlink close each read rewind seek tell


Objekte der Klasse Dir sind Streams, die Verzeichnisse im zugrunde liegenden Dateisystem repräsentieren. Sie stellen eine Anzahl von Wegen zur Verfügung, um Verzeichnisse und ihre Inhalte anzuzeigen. Siehe auch File in diesem Abschnitt.

Das in den nachfolgenden Beispielen verwendete Verzeichnis enthält zwei reguläre Dateien (config.h und main.rb), das übergeordnete Verzeichnis (..), sowie das Verzeichnis selbst (.).
mixins
Enumerable: collect, detect, each_with_index, entries, find, find_all, grep, include?, map, max, member?, min, reject, select, sort, to_a

class methods
[ ] Dir[ einString ] -> einArray

Gibt einArray von Dateinamen zurück, die durch die Erweiterung des Musters in einString gefunden werden. Bei dem Muster handelt es sich nicht um eine regexp (es ist eher ein shell glob) und kann folgende Metazeichen enthalten:

** Steht für Unterverzeichnisse
* Steht für Null oder mehr Zeichen
? Steht für genau ein beliebiges Zeichen
[ zeichenSatz ] Steht für jedes der im Satz enthaltenen Zeichen. Ein Bereich von Zeichen wird mit charVon-charBis notiert. Der Zeichensatz kann mit einem vorangestellten Hochpfeil (^) invertiert, d.h. für Treffer ausgeschlossen, werden.
{ opt, opt, ... } Steht für jeden der vorgegebenen optionalen Strings

Dir["config.?"] » ["config.h"]
Dir["*.[a-z][a-z]"] » ["main.rb"]
Dir["*.[^r]*"] » ["config.h"]
Dir["*.{rb,h}"] » ["main.rb", "config.h"]
Dir["*"] » ["config.h", "main.rb"]

chdir Dir.chdir( [einString] ) -> 0

Wechselt das aktuelle Arbeitsverzeichnis auf den angegebenen String. Wenn kein Argument mitgegeben wird, wird in das in der Umgebungsvariable HOME oder LOGDIR gespeicherte Verzeichnis gewechselt. Die Methode wirft einen SystemCallError (wahrscheinlich Errno::ENOENT) wenn das Zielverzeichnis nicht existiert.

Dir.chdir("/var/spool/mail") » 0
Dir.pwd » "/var/spool/mail"

chroot Dir.chroot( einString ) -> 0

Diese Methode wechselt für den laufenden Prozess die Wurzel des Dateisystems (oder tut zumindest so). Sie kann nur von privilegierten Prozessen aufgerufen werden. Die Methode ist nicht auf allen Plattformen verfügbar. Auf Unix-Systemen finden sich unter chroot(2) ausführlichere Informationen.

Dir.chdir("/production/secure/root")
Dir.chroot("/production/secure/root") »0
Dir.pwd »"/"

delete Dir.delete( einString ) -> 0

Löscht das angegebene Verzeichnis. Eine Unterklasse von SystemCallError wird geworfen, wenn das Verzeichnis nicht leer ist.

entries Dir.entries( einString ) -> einArray

Die Methode gibt ein Array zurück, das alle Dateinamen in dem angegebenen Verzeichnis enthält. Die Methode wirft einen SystemCallError falls das angegebene Verzeichnis nicht existiert.

Dir.entries("testdir") » [".", "..", "config.h", "main.rb"]

foreach Dir.foreach( einString ) {| dateiname | block }

-> nil

Die Methode ruft den Codeblock einmal für jeden Eintrag im angegeben Verzeichnis auf. Dabei wird der Dateiname jedes Eintrags als Argument an den Codeblock übergeben.

Dir.foreach("testdir") {|x| puts("Got " + x) }
produces:
Got .
Got ..
Got config.h
Got main.rb

getwd Dir.getwd -> einString

Gibt den Pfad zum aktuellen Arbeitsverzeichnis des betreffenden Prozesses als String aus.

Dir.chdir("/tmp") » 0
Dir.getwd » "/tmp"

glob Dir.glob( einString ) -> einArray

Synonym für Dir.[].

mkdir Dir.mkdir( einString[, einInteger] ) -> 0

Erstellt ein neues Verzeichnis, das nach einString benannt ist. Die Zugriffsrechte können über den optionalen Parameter einInteger festgelegt werden. Sie können über den Wert von File.umask modifiziert werden. Die Zugriffrechte werden unter NT ignoriert. Die Methode wirft einen SystemCallError wenn das Verzeichnis nicht erstellt werden kann. Siehe auch die Diskussion zu Berechtigungen später in diesem Abschnitt (bei File, Anm.d.Red.).

new Dir.new( einString ) -> einDir

Gibt ein neues Verzeichnis-Objekt für das genannte Verzeichnis zurück.

open Dir.open( einString ) -> einDir
Dir.open( einString ) {| aDir | block }-> nil

Ohne einen Codeblock steht open synonym für Dir.new. Wenn ein Codeblock angegeben ist, wird einDir als Parameter übergeben. Das Verzeichnis wird am Ende des Codeblocks geschlossen und Dir.open gibt nil zurück.

pwd Dir.pwd -> einString

Synonym für Dir.getwd.

rmdir Dir.rmdir( einString ) -> true

Synonym für Dir.delete.

unlink Dir.unlink( einString ) -> true

Synonym für Dir.delete.

instance methods
close dir.close -> nil

Schließt den Verzeichnis-Stream. Jeder weitere Versuch, auf dir zuzugreifen führt zu einem IOError.

d = Dir.new("testdir")
d.close » nil

each dir.each {| | block }

-> dir

Ruft den Codeblock für jeden Eintrag in diesem Verzeichnis auf und übergibt den jeweiligen Dateinamen als Parameter an den Codeblock.

d = Dir.new("testdir")
d.each  {|x| puts ("Got " + x) }
produces:
Got .
Got ..
Got config.h
Got main.rb

read dir.read -> einString oder nil

Liest den nächsten Eintrag aus dir und gibt ihn als String zurück. Gibt nil zurück, wenn das Ende des Streams erreicht ist.

d = Dir.new("testdir")
d.read » "."
d.read » ".."
d.read » "config.h"

rewind dir.rewind -> dir

Positioniert dir auf den ersten Eintrag zurück.

d = Dir.new("testdir")
d.read » "."
d.rewind » #<Dir:0x4018d784>
d.read » "."

seek dir.seek( einInteger ) -> dir

Sucht einen bestimmten Ort aus dir. einInteger muss ein Wert sein, der von Dir#tell zurückgegeben wird.

d = Dir.new("testdir")
d.read » "."
i = d.tell
d.read » ".."
d.seek(i) » #<Dir:0x4018d5b8>
d.read » ".."

tell dir.tell -> einInteger

Gibt die aktuelle Position in dir zurück. Siehe auch Dir#seek.

d = Dir.new("testdir")
d.tell » 0
d.read » "."
d.tell » 12


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".