Die Programmiersprache Ruby (German Edition)
Ergebnis wird dann in einen absoluten Pfad umgewandelt. Wenn das Verzeichnis im Unix-Stil mit einem
~
beginnt, ist das Verzeichnis relativ zum Home-Verzeichnis des aktuellen oder angegebenen Benutzers. Ansonsten ist das Verzeichnis relativ zum aktuellen Arbeitsverzeichnis (siehe weiter unten
Dir.chdir
, um das Arbeitsverzeichnis zu ändern):
Dir.chdir("/usr/bin") # Aktuelles Arbeitsverzeichnis ist "/usr/bin"
File.expand_path("ruby") # => "/usr/bin/ruby"
File.expand_path("~/ruby") # => "/home/david/ruby"
File.expand_path("~matz/ruby") # => "/home/matz/ruby"
File.expand_path("ruby", "/usr/local/bin") # => "/usr/local/bin/ruby"
File.expand_path("ruby", "../local/bin") # => "/usr/local/bin/ruby"
File.expand_path("ruby", "~/bin") # => "/home/david/bin/ruby"
Die Methode
File.identical?
prüft, ob sich zwei Dateinamen auf dieselbe Datei beziehen. Das kann der Fall sein, wenn die Namen gleich sind, nützlicher ist die Methode aber, wenn sich die Namen unterscheiden. Zwei verschiedene Namen können sich zum Beispiel auf dieselbe Datei beziehen, wenn der eine einen relativen Pfad und der andere einen absoluten Pfad hat. Einer kann »
..
« enthalten, um eine Ebene nach oben und dann wieder nach unten zu gehen. Oder zwei verschiedene Namen beziehen sich auf dieselbe Datei, wenn der eine ein symbolischer Link oder ein Shortcut (oder Hard-Link auf Plattformen, die das unterstützen) auf den anderen Pfad ist. Beachten Sie allerdings, dass
File.identical?
nur dann
true
zurückliefert, wenn sich zwei Namen auf dieselbe Datei beziehen und die Datei auch tatsächlich existiert. Beachten Sie weiterhin, dass
File.identical?
das Zeichen
~
nicht so umwandelt, wie es
File.expand_path
tut:
File.identical?("ruby", "ruby") # => true, wenn die Datei existiert
File.identical?("ruby", "/usr/bin/ruby") # => true, wenn aktuelles Arbeitsverzeichnis
# /usr/bin ist
File.identical?("ruby", "../bin/ruby") # => true, wenn aktuelles Arbeitsverzeichnis
# /usr/bin ist
File.identical?("ruby", "ruby1.9") # => true, wenn es einen Link gibt
Schließlich prüft
File.fnmatch
, ob ein Dateiname einem angegebenen Muster entspricht. Das Muster ist kein regulärer Ausdruck, sondern eher wie die in Shells verwendeten Dateimuster zu nutzen. »
?
« entspricht einem einzelnen Zeichen. »
*
« entspricht einer beliebigen Zahl von Zeichen. Und »
**
« entspricht einer beliebigen Zahl von Verzeichnisebenen. Zeichen in eckigen Klammern sind Alternativen, wie in regulären Ausdrücken.
fnmatch
erlaubt keine Alternativen in geschweiften Klammern (was die weiter unten beschriebene Methode
Dir.glob
sehr wohl tut).
fnmatch
sollte im Allgemeinen mit einem dritten Argument
File::FNM_PATHNAME
aufgerufen werden, das verhindert, dass »
*
« zu »
/
« passt. Fügen Sie
File::FNM_DOTMATCH
hinzu, wenn Sie auch »versteckte« Dateien und Verzeichnisse finden wollen, deren Namen mit »
.
« beginnen. Hier werden nur ein paar Beispiele für
fnmatch
vorgestellt. Mit
ri File.fnmatch
erhalten Sie alle Details. Beachten Sie, dass
File.fnmatch?
ein Synonym ist:
File.fnmatch("*.rb", "hello.rb") # => true
File.fnmatch("*.[ch]", "ruby.c") # => true
File.fnmatch("*.[ch]", "ruby.h") # => true
File.fnmatch("?.txt", "ab.txt") # => false
flags = File::FNM_PATHNAME | File::FNM_DOTMATCH
File.fnmatch("lib/*.rb", "lib/a.rb", flags) # => true
File.fnmatch("lib/*.rb", "lib/a/b.rb", flags) # => false
File.fnmatch("lib/**/*.rb", "lib/a.rb", flags) # => true
File.fnmatch("lib/**/*.rb", "lib/a/b.rb", flags) # => true
9.6.2 Verzeichnisinhalte
Der einfachste Weg, den Inhalt eines Verzeichnisses auszugeben, ist die Verwendung der Methode
Dir.entries
oder des Iterators
Dir.foreach
:
# Namen aller Dateien im Verzeichnis config/ erhalten
filenames = Dir.entries("config") # Namen als Array auslesen
Dir.foreach("config") {|filename| ... } # Iteriere über Namen
Die von diesen Methoden zurückgegebenen Namen haben keine vorgegebene Reihenfolge und enthalten (auf Unix-artigen Plattformen) »
.
« (das aktuelle Verzeichnis) und »
..
« (das übergeordnete Verzeichnis). Um eine Liste mit Dateien zu erhalten, die einem gegebenen Muster entsprechen, verwenden Sie den Operator
Dir.[]
:
Dir['*.data'] # Dateien mit der Erweiterung "data"
Dir['ruby.*'] # Alle Dateinamen, die mit "ruby." beginnen
Dir['?'] # Alle Dateinamen mit nur einem Zeichen
Dir['*.[ch]'] # Alle Dateien, die auf .c oder .h enden
Dir['*.{java,rb}'] # Alle Dateien, die auf .java oder .rb enden
Dir['*/*.rb'] # Alle Ruby-Programme in allen direkten
Weitere Kostenlose Bücher