Ruby for Newbies lavorare con directory e file

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.

я


Visualizza Screencast


Elenchi

pwd

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.

chdir

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.

glob

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

nuovo e aperto

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.

ogni

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.

inserimenti

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.


File

Ruby offre anche un'utile API per lavorare con i file.

absolute_path

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"

basename

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.

Elimina

L'ovvio uso di questo è quello di eliminare il file che si passa nel metodo:

File.delete "code.rb"

elenco?

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 Apertos 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.

nuovo e aperto

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:

  • ?r? : sola lettura
  • ?w? : solo scrittura (sovrascrive qualsiasi cosa nel file, se il file esiste)
  • ?w +? : leggere e scrivere (sovrascrive qualsiasi cosa nel file, se il file esiste)
  • ?un? : solo scrittura (inizia alla fine del file, se il file esiste)

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à.

Lettura

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

scrittura

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

Domanda per te

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!