Ruby è una delle lingue più popolari utilizzate sul web. Abbiamo recentemente avviato una nuova sessione qui su Nettuts + che ti introdurrà a Ruby, oltre ai grandi framework e strumenti che accompagnano lo sviluppo di Ruby. Oggi guarderemo il dir
e File
classi e come possiamo usarli per lavorare con directory e file.
я
Se hai lavorato molto con il terminale (linea di comando AKA, shell AKA), saprai che ha la nozione di una directory corrente, chiamata directory di lavoro. Questa è la cartella in cui ci si trova. Ogni volta che si digita un comando che utilizza un file, la directory di lavoro sarà il primo posto in cui la shell cerca il file.
Ruby ha una nozione simile quando si esegue il codice. Comprende la struttura delle cartelle del sistema operativo e ha alcuni strumenti utili per lavorarci.
Quindi, come fai a sapere in quale cartella sei ruby script pensa che sia?
Dir.pwd # "/ Users / andrew / Documents"
Il pwd
(stampa directory di lavoro) sul dir
la classe ci dà quell'informazione. Se sei dentro IRB
, la directory di lavoro sarà, per impostazione predefinita, la cartella che hai avviato IRB
in. Se sei in uno script, sarà la posizione da cui stai chiamando lo script.
Se si desidera modificare la directory di lavoro, è possibile utilizzare il chdir
metodo; passare il percorso alla directory che si desidera spostare:
Dir.chdir "Documenti" Dir.chdir "/ users / andrew / Documents"
Come puoi vedere, il parametro stringa può essere un percorso assoluto o relativo.
Se stai cercando determinati file all'interno della directory di lavoro (Dir.pwd
), puoi ottenerli usando il Dir.glob
metodo. Passa quel metodo a? Glob ?; questo è un modello di ricerca che si trova tra una stringa statica e un'espressione regolare completa. È possibile utilizzare un asterisco *
come un jolly, proprio come si potrebbe nella shell; puoi usare un doppio asterisco **
per abbinare le directory in modo ricorsivo. Puoi anche utilizzare i set tra parentesi quadre come faresti con le espressioni regolari. Se hai bisogno di più, controlla i documenti completi. Dir.glob
con ritorno un array? oppure, puoi passare un blocco e ottenere ogni incontro uno su on.
# Ricorda che questo viene eseguito nella directory corrente all_text_files = Dir.glob "* .txt" Dir.glob ("** / *. [A-z]") do | nomefile | # corrisponderà a qualsiasi file in qualsiasi directory secondaria con una singola estensione di lettera minuscola
Oltre ad ospitare funzioni utili, puoi anche creare un'istanza di dir
classe. Si passa il nome della directory che si desidera utilizzare; come con tutte le funzioni che prendono un percorso, può essere assoluto o relativo.
reciepts = Dir.new "reciepts" me = Dir.open "/ users / andrew"
Tutti e due nuovo
e Aperto
ritorno a dir
oggetto; tuttavia, c'è un altro modo di usare Aperto
:
Dir.open "/ users / andrew" do | dir | # usalo qui fine
Questa è una convenzione comune con molte classi in Ruby; invece di memorizzare il dir
oggetto in una variabile, puoi passarlo a un blocco e usarlo da lì. È uno stile di codifica piuttosto diverso che non ho visto in nessun altro linguaggio, ma è piuttosto bello solo che ci si abitua.
Ci sono buone probabilità che quando crei un dir
oggetto, ti consigliamo di lavorare con il contenuto di esso. Ci sono alcuni modi per farlo.
assumendo some_dir
è dir
oggetto,
some_dir.each do | file | # Fai qualcosa
Puoi usare il ogni
metodo attivo dir
oggetti per scorrere su ogni file o directory che si trova al suo interno. Nota che non stai ricevendo un File
o dir
oggetto; solo una stringa con il suo nome; se vuoi fare di più, dovrai istanziare l'oggetto appropriato da te.
Se vuoi solo vedere cosa c'è dentro una directory, puoi usare il inserimenti
proprietà, per ottenere una matrice dei contenuti:
some_dir.entries # [".", "?", "file_one.txt", "another_directory"]
Come vedrai sopra, le voci di una directory includono?.? e ?? ?, puntatore stesso e la sua directory genitore.
Ruby offre anche un'utile API per lavorare con i file.
Quando lavori con i file, potresti trovarti a voler ottenere il percorso assoluto di uno. Il File
la classe offre esattamente ciò di cui hai bisogno:
File.absotule_path "plans.txt" # => "/users/andrew/Documents/plans.txt"
Ma che dire del contrario? Hai il percorso assoluto e vuoi solo il nome del file? Invece, usa basename
File.basename ("/ users / andrew / Documents / plans.txt") # => "plans.txt" File.basename ("/ users / andrew / Documents / plans.txt", ".txt") # => "piani"
Se passi un secondo parametro di stringa, il metodo cercherà quella stringa alla fine del nome del file e rimuoverà se è lì; questo non deve essere l'estensione del file, ma questo è l'uso principale ovvio per questo.
L'ovvio uso di questo è quello di eliminare il file che si passa nel metodo:
File.delete "code.rb"
Questo è utile; Dì che sei ogni
-sopra le voci di a dir
oggetto, ma tu vuoi solo trattare con i file. Il File.directory?
il metodo tornerà vero
se il parametro stringa che si passa ad esso è una directory, e falso
se è un file.
Dir.open (Dir.pwd) .each do | filename | dopo se File.directory? nomefile # altrimenti, fine del file di processo
Questo frammento Aperto
s la directory corrente e passa un blocco a ogni
metodo. Il ogni
metodo passa le voci della directory una per una al blocco. Quella prima riga all'interno del blocco potrebbe confondervi un po 'se non siete abituati a Ruby, ma guardatelo attentamente. L'unica parte che non conosci è la Il prossimo
parola chiave, che salta il resto del blocco e passa alla successiva iterazione di esso. Quindi, stiamo dicendo, "salta alla voce successiva se la voce che abbiamo attualmente è una directory. Se non è una directory, possiamo fare tutto ciò che vogliamo.
Fare istanze del File
la classe funziona esattamente come con dir
; File.new
restituisce a File
oggetto, mentre File.open
può restituirlo o passarlo a un blocco. Dovresti anche passare un secondo parametro, che decide come verrà aperto il file. Il più delle volte, probabilmente userete questi:
Quindi, quali metodi ha un'istanza di File
darvi? Bene, questi metodi in realtà provengono dal IO
classe, da cui File
eredita. La maggior parte delle volte aprirai un file per leggere o scrivere contenuti da esso, quindi diamo un'occhiata a questa funzionalità.
Prima di iniziare, ricorda questo: il modo in cui un file funziona, una volta che una riga è stata letta, non appare più; ti stai facendo strada attraverso il file. In qualsiasi momento, puoi usare il f.rewind
metodo per tornare all'inizio del file.
Se vuoi solo leggere il tutto, puoi farlo con leggere
.
f = File.open ("sample.txt", "r") # assume questo file per il prossimo paio di frammenti f.read # => "qualcosa \ nline 2 \ na terzo \ nquesto! \ n5555 \ nsixy \ nsevenly \ Neight"
Tuttavia, probabilmente vorrai leggere una riga alla volta; per farlo, usa il metodo linea di lettura
:
f.rewind # indietro all'inizio f.readline # "something \ n" f.readline # "riga 2 \ n" f.readline # "un terzo \ n"
Puoi anche usare il metodo prende
invece di linea di lettura
.
C'è anche un readlines
metodo, che restituisce una matrice in cui le righe come voci:
f.rewind f.readlines # => ["something \ n", "line 2 \ n", "un terzo \ n", "quattro! \ n", "5555 \ n", "sixy \ n", " sevenly \ n "," eight "]
Finalmente puoi usare ogni
, e passare un blocco al metodo per lavorare con ciascuna linea, uno per uno
f.rewind f.each do | line | mette fine linea
Per scrivere, hai due opzioni: Scrivi
e mette
. La differenza principale è questa mette
aggiunge un'interruzione di riga alla fine della stringa, mentre Scrivi
non.
f = File.open ("file.txt", "w +") f.puts "prima riga" f.write "secondo" f.write "riga" f.rewind f.readlines # => ["prima riga \ n ", "seconda linea"]
Bene, questo è tutto per Ruby For Newbies, Lezione 7. C'è altro da scoprire in dir
e File
classi; controlla i documenti per Dir, File e IO per altri (la classe IO è dove File eredita i suoi metodi di istanza da).
Tuttavia, sono curioso di sapere dove vuoi che questa serie passi da qui: vuoi continuare con il linguaggio Ruby, o vuoi passare all'utilizzo di Ruby sul web? Entrambe le indicazioni saranno preziose per te come sviluppatore web, quindi esprimi la tua opinione nei commenti!