Die Programmiersprache Ruby (German Edition)
Unterverzeichnissen
Dir['**/*.rb'] # Alle Ruby-Programme in allen Unterverzeichnissen
Eine mächtigere Alternative zu
Dir[]
ist
Dir.glob
. (Das Verb »glob« ist ein alter Begriff in Unix, um in einer Shell Dateinamen anhand eines Musters zu finden.) Standardmäßig funktioniert diese Methode wie
Dir[]
, aber wenn ein Block übergeben wird, gibt sie die passenden Dateinamen nach und nach zurück und nicht als ein Array. Zudem kann man der Methode
glob
ein optionales zweites Argument übergeben. Wenn Sie die Konstante
File::FNM_DOTMATCH
(siehe
File.fnmatch
weiter oben) als dieses zweite Argument angeben, enthält das Ergebnis auch Dateien, deren Namen mit einem »
.
« beginnen (auf Unix-Systemen sind diese Dateien versteckt und werden nicht standardmäßig zurückgegeben):
Dir.glob('*.rb') {|f| ... } # Über alle Ruby-Dateien iterieren
Dir.glob('*') # Enthält keine Dateien, die mit '.' beginnen
Dir.glob('*',File::FNM_DOTMATCH) # Enthält .-Dateien, so wie Dir.entries
Die hier gezeigten Methoden zum Ausgeben von Verzeichnisinhalten und alle
File
- und
Dir
-Methoden, die relative Pfadnamen auflösen, tun das relativ zum »aktuellen Arbeitsverzeichnis«, bei dem es sich um einen für den Ruby-Interpreter-Prozess globalen Wert handelt. Sie können das aktuelle Arbeitsverzeichnis (»CWD« für Current Working Directory ) mit den Methoden
getwd
und
chdir
abfragen beziehungsweise setzen:
puts Dir.getwd # Gib aktuelles Arbeitsverzeichnis aus
Dir.chdir("..") # Ändere CWD auf das übergeordnete Verzeichnis
Dir.chdir("../sibling") # Wechsle zu einem "Geschwister"-Verzeichnis
Dir.chdir("/home") # Wechsle in ein absolutes Verzeichnis
Dir.chdir # Wechsle in das Home-Verzeichnis des Benutzers
home = Dir.pwd # pwd ist ein Alias für getwd
Wenn Sie einen Block an die Methode
chdir
übergeben, wird das Verzeichnis wieder auf seinen Ursprungswert zurückgesetzt, wenn der Block verlassen wird. Beachten Sie allerdings, dass ein Verzeichniswechsel zwar zeitlich begrenzt sein mag, der Effekt aber global ist und auch andere Threads betrifft. Zwei Threads können
Dir.chdir
nicht gleichzeitig mit einem Block aufrufen.
9.6.3 Dateien prüfen
File
definiert eine Reihe von Methoden, um Metadaten über eine per Namen ausgewählte Datei oder ein Verzeichnis zu erhalten. Viele der Methoden liefern Low-Level-Informationen zurück, die betriebssystemabhängig sind. Nur die portabelsten und am häufigsten verwendeten Methoden werden hier vorgestellt. Mit ri für die Klassen
File
und
File::Stat
erhalten Sie eine komplette Liste von Methoden.
Die folgenden einfachen Methoden liefern grundlegende Informationen über eine Datei. Die meisten sind Prädikate, die als Ergebnis
true
oder
false
haben:
f = "/usr/bin/ruby" # Ein Dateiname für die folgenden Beispiele
# Existenz und Typ der Datei
File.exist?(f) # Gibt es den angegebenen Dateinamen? Auch: File.exists?
File.file?(f) # Ist dies eine bestehende Datei?
File.directory?(f) # Oder ein vorhandenes Verzeichnis?
File.symlink?(f) # Oder ein symbolischer Link?
# Methoden für die Dateigröße. Mit File.truncate setzen Sie die Dateigröße.
File.size(f) # Dateigröße in Byte
File.size?(f) # Größe in Byte oder nil, wenn die Datei leer ist
File.zero?(f) # true, wenn die Datei leer ist
# Dateiberechtigungen. Mit File.chmod setzen Sie Berechtigungen (abhängig vom System).
File.readable?(f) # Können wir die Datei lesen?
File.writable?(f) # Können wir in die Datei schreiben? Kein "e" in "writable"
File.executable?(f) # Können wir die Datei ausführen?
File.world_readable?(f) # Kann jeder die Datei lesen? Ruby 1.9
File.world_writable?(f) # Kann jeder in die Datei schreiben? Ruby 1.9
# Zeiten/Datumsangaben einer Datei. Mit File.utime setzen Sie diese Werte.
File.mtime(f) # => Zeitpunkt der letzten Änderung als Time-Objekt
File.atime(f) # => Letzte Zugriffszeit als Time-Objekt
Eine andere Möglichkeit, den Typ (Datei, Verzeichnis, symbolischer Link und so weiter) eines Dateinamens zu ermitteln, ist die Methode
ftype
, die einen String mit dem Namen des Typs zurückgibt. Angenommen, /usr/bin/ruby ist ein symbolischer Link (oder ein Shortcut) auf
/usr/bin/ruby1.9
:
File.ftype("/usr/bin/ruby") # => "link"
File.ftype("/usr/bin/ruby1.9") # => "file"
File.ftype("/usr/lib/ruby") # => "directory"
File.ftype("/usr/bin/ruby3.0") # SystemCallError: Datei oder Verzeichnis nicht vorhanden
Wenn Sie an mehreren Informationen über eine Datei interessiert sind, kann es effizienter sein,
stat
oder
lstat
aufzurufen.
Weitere Kostenlose Bücher