Scripttip: Datei- und Verzeichnis-Operationen mit Ruby

Das Bearbeiten von Dateien und Verzeichnissen ist eine sehr häufig wiederkehrende Arbeit in der Programmierung.
Daher gibt es in unserem heutigen Scripttip ein paar Tips zu diesem Thema. Wie aus anderen Bereichen bekannt, sind Zugriffe und Manipulation von Dateien und Verzeichnissen mit Ruby sehr einfach.

Im ersten Beispiel erstellen wir eine Datei. Sie wird dort angelegt von wo das Script ausgeführt wird.

Eine einfach Text-Datei erstellen:
[ruby]
datei = ‚datei.txt‘
File.open(datei, ‚w‘) {|d| d.write ‚Text für die neue Datei‘}
[/ruby]

Soll die Datei an einem bestimmten Ort/Pfad erstellt werden, müssen ggf. die entsprechenden Verzeichnisse erst angelegt werden.
Dazu kann die „mkdir_p“ Methode aus FileUtils benutzt werden, weil diese sicherstellt, dass alle benötigten Ordner im Pfad angelegt werden.

[ruby]
require ‚fileutils‘

datei = ‚/tmp/mein/pfad/zur/datei.txt‘
FileUtils.mkdir_p File.dirname(datei)
File.open(datei, ‚w‘) do |d|
d.write ‚Beispieltext für die neu erzeugte Datei‘
end
[/ruby]

Soll die Original-Datei unverändert bleiben, kann eine Kopie erzeugt werden um die Manipulationen an dieser vorzunehmen.
[ruby]
require ‚fileutils‘

FileUtils.copy(‚datei.txt‘, ‚kopie.txt‘)
[/ruby]

Auch das Verschieben einer Datei ist auch sehr einfach mit FileUtils.

[ruby]
require ‚fileutils‘

alter_pfad = "/der/alte/pfad/zur/datei.txt"
neuer_pfad = "/der/neue/ort/der/datei.txt"
# ggf. die benötigten Verzeichnisse erstellen
FileUtils.mkdir_p File.dirname(neuer_pfad)

FileUtils.mv(‚/der/alte/pfad/zur‘, ‚/opt/new/location/your_file‘)
[/ruby]

Dies ist nur ein kleiner Auszug aus den Möglichkeiten die FileUtils bietet.
Eine Liste weiterer Methoden sind in den RubyDocs verfügbar.
Neugierige können sich in der irb-Konsole einen Auszug der Methoden geben lassen.
Die meisten Funktions-Namen sind an die Unix-Kommandos angelehnt und in der Regel selbstsprechend.
[ruby]
irb(main):001:0> require ‚PP‘
=> true
irb(main):001:0> require ‚fileutils‘
=> true

irb(main):007:0> pp FileUtils.singleton_methods.sort
["cd",
"chdir",
"chmod",
"chmod_R",
"chown",
"chown_R",
"cmp",
"collect_method",
"commands",
"compare_file",
"compare_stream",
"copy",
"copy_entry",
"copy_file",
"copy_stream",
"cp",
"cp_r",
"getwd",
"have_option?",
"identical?",
"install",
"link",
"ln",
"ln_s",
"ln_sf",
"makedirs",
"mkdir",
"mkdir_p",
"mkpath",
"move",
"mv",
"options",
"options_of",
"private_module_function",
"pwd",
"remove",
"remove_dir",
"remove_entry",
"remove_entry_secure",
"remove_file",
"rm",
"rm_f",
"rm_r",
"rm_rf",
"rmdir",
"rmtree",
"safe_unlink",
"symlink",
"touch",
"uptodate?"]
=> nil
[/ruby]

Bevor wir diesen Scripttip abschließen, noch ein kleiner Tip zu temporären Dateien.
Häufig wird eine Datei nur zum „zwischenlagern“ benötigt. Das heißt die Datei wird spätestens nach der Asführung des Scripts nicht mehr benötigt.
Solche Dateien selber anzulegen, erfordert gleichzeitig, dass sie selber gelöscht werden (Aufräumscript, Cron, etc.). Weiterhin kann es zu Namenskollisionen kommen, wenn eine Datei mit dem gleichen Namen vorhanden, usw.
All diese Arbeit wird in Ruby von „Tempfile“ abgenommen und sollte für diese Zwecke eingesetzt werden.

[ruby]
require ‚tempfile‘

temp_datei = Tempfile.new(‚temporaere_datei.txt‘)
temp_datei << "Daten zum Zwischenlagern"
temp_datei.close
[/ruby]

temp_datei.close wird zwar bei Script-Ende automatisch ausgeführt, aber auf diese Weise behält man die Kontrolle.

Wir hoffen der Scripttip hilft euch bei euren zukünftigen Datei-Operationen.