Ruby ist eine der beliebtesten Sprachen im Internet. Wir haben vor kurzem eine neue Session hier bei Nettuts + gestartet, die Sie in Ruby einführen wird, sowie die großartigen Frameworks und Tools, die mit der Ruby-Entwicklung einhergehen. Heute schauen wir uns das an Dir
und Datei
Klassen und wie wir sie verwenden können, um mit Verzeichnissen und Dateien zu arbeiten.
я
Wenn Sie viel mit dem Terminal gearbeitet haben (AKA-Befehlszeile, AKA-Shell), wissen Sie, dass es sich um ein aktuelles Verzeichnis handelt, das als Arbeitsverzeichnis bezeichnet wird. Dies ist der Ordner, in dem Sie sich gerade befinden. Wenn Sie einen Befehl eingeben, der eine Datei verwendet, ist das Arbeitsverzeichnis der erste Ort, an dem Ihre Shell die Datei sucht.
Ruby hat eine ähnliche Vorstellung, wenn er Code ausführt. Es versteht die Ordnerstruktur des Betriebssystems und verfügt über einige hilfreiche Tools, um damit zu arbeiten.
Wie finden Sie heraus, in welchem Ordner sich Ihr Ruby-Skript befindet??
Dir.pwd # "/ Benutzer / andrew / Documents"
Das pwd
(Arbeitsverzeichnis drucken) auf der Dir
Klasse gibt uns diese Informationen. Wenn du dabei bist irb
, Ihr Arbeitsverzeichnis ist standardmäßig der Ordner, den Sie gestartet haben irb
Wenn Sie sich in einem Skript befinden, ist dies der Ort, von dem aus Sie das Skript aufrufen.
Wenn Sie das Arbeitsverzeichnis ändern möchten, können Sie das verwenden chdir
Methode; Übergeben Sie den Pfad zu dem Verzeichnis, in das Sie verschieben möchten:
Dir.chdir "Dokumente" Dir.chdir "/ users / andrew / Documents"
Wie Sie sehen, kann der String-Parameter entweder ein absoluter oder ein relativer Pfad sein.
Wenn Sie nach bestimmten Dateien im Arbeitsverzeichnis suchen (Dir.pwd
) können Sie sie mit der Dir.glob
Methode. Übergeben Sie diese Methode als "glob"; Dies ist ein Suchmuster, das zwischen einer statischen Zeichenfolge und einem vollständigen regulären Ausdruck liegt. Sie können ein Sternchen verwenden *
als Platzhalter, so wie Sie es in der Schale tun könnten; Sie können ein doppeltes Sternchen verwenden **
Verzeichnisse rekursiv abgleichen. Sie können Sets auch in eckigen Klammern verwenden, wie Sie dies bei regulären Ausdrücken tun würden. Wenn Sie mehr benötigen, lesen Sie die vollständigen Dokumente. Dir.glob
mit ein Array zurückgeben? oder Sie können es einen Block übergeben und jedes Match einzeln durch.
# Denken Sie daran, dies läuft im aktuellen Verzeichnis all_text_files = Dir.glob "* .txt" Dir.glob ("** / *. [A-z]") do | Dateiname | # stimmt mit jeder Datei in einem untergeordneten Verzeichnis mit einem einzelnen Erweiterungsende in Kleinbuchstaben überein
Sie können neben nützlichen Funktionen auch eine Instanz des erstellen Dir
Klasse. Sie übergeben den Namen des Verzeichnisses, das Sie verwenden möchten. Wie bei allen Funktionen, die einen Pfad annehmen, kann dieser absolut oder relativ sein.
reciepts = Dir.new "reciepts" me = Dir.open "/ users / andrew"
Beide Neu
und öffnen
Rückkehr a Dir
Objekt; Es gibt jedoch eine andere Möglichkeit, sie zu verwenden öffnen
:
Dir.open "/ users / andrew" do | dir | # Verwenden Sie es hier enden
Dies ist eine übliche Konvention mit vielen Klassen in Ruby; anstatt das zu speichern Dir
Objekt in einer Variablen können Sie es an einen Block übergeben und von dort aus verwenden. Es ist ein ziemlich anderer Codierstil, den ich in keiner anderen Sprache gesehen habe, aber es ist schön, dass Sie sich erst daran gewöhnen.
Es besteht eine gute Chance, dass wenn Sie ein erstellen Dir
Objekt, Sie möchten mit dem Inhalt davon arbeiten. Dafür gibt es mehrere Möglichkeiten.
Angenommen, some_dir
ist Dir
Objekt,
some_dir.each do | file | # mach etwas ende
Du kannst den ... benutzen jeder
Methode auf Dir
Objekte zum Durchlaufen aller darin enthaltenen Dateien oder Verzeichnisse. Beachten Sie, dass Sie keine bekommen Datei
oder Dir
Objekt; nur eine Zeichenfolge mit dem Namen davon; Wenn Sie mehr tun möchten, müssen Sie das entsprechende Objekt selbst instanziieren.
Wenn Sie nur sehen möchten, was sich in einem Verzeichnis befindet, können Sie das verwenden Einträge
Eigenschaft, um ein Array des Inhalts zu erhalten:
some_dir.entries # [".", "?", "file_one.txt", "another_directory"]
Wie Sie oben bemerken werden, umfassen die Elemente für ein Verzeichnis?.? und ?? ?, zeige es selbst und sein übergeordnetes Verzeichnis.
Ruby bietet auch eine hilfreiche API für die Arbeit mit Dateien.
Wenn Sie mit Dateien arbeiten, möchten Sie möglicherweise den absoluten Pfad einer Datei erhalten. Das Datei
Klasse bietet genau das, was Sie brauchen:
File.absotule_path "plans.txt" # => "/users/andrew/Documents/plans.txt"
Aber was ist andersherum? Sie haben den absoluten Pfad und möchten nur den Dateinamen? Verwenden Sie stattdessen Basisname
File.basename ("/ users / andrew / Documents / plans.txt") # => "plans.txt" File.basename ("/ users / andrew / Documents / plans.txt", ".txt") # => "Pläne"
Wenn Sie einen zweiten Zeichenfolgeparameter übergeben, sucht die Methode am Ende des Dateinamens nach dieser Zeichenfolge und entfernt sie, falls vorhanden. Dies muss nicht die Dateierweiterung sein, aber das ist die offensichtliche Hauptanwendung dafür.
Die offensichtliche Verwendung besteht darin, die Datei zu löschen, die Sie an die Methode übergeben:
File.delete "code.rb"
Dies ist nützlich. sag du bist jeder
-über die Einträge von a Dir
Objekt, aber Sie möchten nur mit Dateien umgehen. Das Dateiverzeichnis?
Methode wird zurückkehren wahr
Wenn der Zeichenfolgeparameter, den Sie übergeben, ein Verzeichnis ist, und falsch
wenn es eine Datei ist.
Dir.open (Dir.pwd) .each do | Dateiname | weiter wenn File.directory? Dateiname # Andernfalls Prozessdateiende
Dieser Ausschnitt öffnen
s das aktuelle Verzeichnis und übergibt einen Block an jeder
Methode. Das jeder
Die Methode übergibt die Einträge des Verzeichnisses einzeln an den Block. Diese erste Zeile innerhalb des Blocks kann Sie etwas verwirren, wenn Sie nicht an Ruby gewöhnt sind, aber genau hinschauen. Der einzige Teil, den Sie nicht kennen, ist der Nächster
Schlüsselwort, das den Rest des Blocks überspringt und zur nächsten Iteration des Blocks geht. Wir sagen also, springen Sie zum nächsten Eintrag, wenn der derzeitige Eintrag ein Verzeichnis ist. Wenn es kein Verzeichnis ist, können wir tun, was wir wollen.
Instanzen des machen Datei
Klasse funktioniert genauso wie mit Dir
; File.new
kehrt zurück Datei
Objekt, während Datei öffnen
kann es zurückgeben oder an einen Block übergeben. Sie sollten auch einen zweiten Parameter übergeben, der bestimmt, wie die Datei geöffnet wird. Meistens werden Sie wahrscheinlich diese verwenden:
Welche Methoden hat eine Instanz von Datei
gebe dir? Nun, diese Methoden kommen eigentlich aus dem IO
Klasse, aus der Datei
erbt. In den meisten Fällen öffnen Sie eine Datei, um Inhalte daraus zu lesen oder zu schreiben. Sehen wir uns also diese Funktionalität an.
Bevor wir beginnen, sollten Sie Folgendes bedenken: Wenn eine Zeile einmal gelesen wurde, wird sie nicht mehr angezeigt. Sie arbeiten sich durch die Datei. Sie können das jederzeit verwenden f.rewind
Methode, um zum Anfang der Datei zurückzukehren.
Wenn Sie nur das Ganze lesen möchten, können Sie dies mit tun lesen
.
f = File.open ("sample.txt", "r") # Nehmen Sie diese Datei für die nächsten paar Snippets an. f.read # => "etwas \ nline 2 \ na dritte \ nfour! \ n5555 \ nsixy \ nsevenly \ neight "
Sie möchten jedoch wahrscheinlich immer nur eine Zeile lesen. Verwenden Sie dazu die Methode Zeile lesen
:
f.rewind # zurück am Anfang f.readline # "etwas \ n" f.readline # "Zeile 2 \ n" f.readline # "ein drittes \ n"
Sie können auch die Methode verwenden bekommt
anstatt Zeile lesen
.
Es gibt auch ein Readlines
Methode, die ein Array zurückgibt, in dem die Zeilen als Einträge vorliegen:
f.rewind f.readlines # => ["etwas \ n", "Zeile 2 \ n", "ein drittes \ n", "vier! \ n", "5555 \ n", "sixy \ n", " sieben \ n "," acht "]
Schließlich können Sie verwenden jeder
, und übergeben Sie einen Block an die Methode, um nacheinander mit jeder Zeile zu arbeiten
f.rewind f.each do | line | Setzt das Zeilenende
Für das Schreiben haben Sie zwei Möglichkeiten: schreiben
und setzt
. Der Hauptunterschied ist das setzt
fügt einen Zeilenumbruch am Ende Ihrer Zeichenfolge ein, während schreiben
nicht.
f = File.open ("file.txt", "w +") f.puts "erste Zeile" f.write "zweite" f.write "Zeile" f.rewind f.readlines # => ["erste Zeile \ n ", "zweite Reihe"]
Nun, das ist alles für Ruby For Newbies, Lektion 7. Es gibt noch mehr zu entdecken Dir
und Datei
Klassen; Weitere Informationen finden Sie in den Dokumenten für Dir, File und IO (in der IO-Klasse übernimmt File die Instanzmethoden)..
Ich bin jedoch neugierig, wohin diese Serie gehen soll: Möchten Sie mit der Sprache Ruby fortfahren, oder möchten Sie Ruby im Web nutzen? Beide Richtungen sind für Sie als Webentwickler wertvoll, sprechen Sie Ihre Meinung in den Kommentaren aus!