Ruby for Newbies Arbeiten mit Verzeichnissen und Dateien

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.

я


Screencast anzeigen


Verzeichnisse

pwd

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.

chdir

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.

glob

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

neu offen

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.

jeder

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.

Einträge

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.


Dateien

Ruby bietet auch eine hilfreiche API für die Arbeit mit Dateien.

absoluter Pfad

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"

Basisname

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.

löschen

Die offensichtliche Verwendung besteht darin, die Datei zu löschen, die Sie an die Methode übergeben:

File.delete "code.rb"

Verzeichnis?

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 öffnens 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.

neu offen

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:

  • ?r? : schreibgeschützt
  • ?w? : Nur-Schreiben (überschreibt alles in der Datei, falls die Datei existiert)
  • ?w +? : Lesen und Schreiben (überschreibt alles in der Datei, falls die Datei existiert)
  • ?ein? : Nur Schreiben (beginnt am Ende der Datei, falls die Datei vorhanden ist)

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.

lesen

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

Schreiben

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

Frage für dich

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!