Ruby er et av de mest populære språkene som brukes på nettet. Vi har nylig startet en ny sesjon her på Nettuts + som vil introdusere deg til Ruby, i tillegg til de store rammeverkene og verktøyene som følger med Ruby-utviklingen. I dag ser vi på dir
og Fil
klasser, og hvordan vi kan bruke dem til å jobbe med kataloger og filer.
я
Hvis du har gjort mye arbeid med terminalen (AKA kommandolinje, AKA-skall), vet du at den har begrepet en gjeldende katalog, kalt arbeidskatalogen. Dette er mappen du er inne i. Når du skriver en kommando som bruker en fil, vil arbeidskatalogen være det første stedet du ser på skallet å finne filen.
Ruby har en lignende oppfatning når du kjører kode. Den forstår operativsystemets mappestruktur, og har noen nyttige verktøy for å jobbe med det.
Så, hvordan finner du ut hvilken mappe du er ruby script mener det er i?
Dir.pwd # "/ Brukere / andrew / Dokumenter"
De pwd
(skriv ut arbeidskatalog) metode på dir
klassen gir oss den informasjonen. Hvis du er i IRB
, arbeidsboken din vil være som standard - mappen du startet IRB
i. Hvis du er i et skript, blir stedet du ringer skriptet fra.
Hvis du vil endre arbeidskatalogen, kan du bruke chdir
metode; send den til banen du vil flytte til:
Dir.chdir "Dokumenter" Dir.chdir "/ users / andrew / Documents"
Som du kan se, kan strengparameteren enten være en absolutt eller en relativ bane.
Hvis du leter etter bestemte filer i arbeidskatalogen (Dir.pwd
), kan du få dem ved å bruke Dir.glob
metode. Pass den metoden a? Glob ?; Det er et søkemønster som er et sted mellom en statisk streng og et fullt regulært uttrykk. Du kan bruke en stjerne *
som et wildcard, akkurat som du kanskje i skallet; Du kan bruke en dobbel stjerne **
å matche kataloger rekursivt. Du kan også bruke sett i firkantede parenteser som du ville med vanlige uttrykk. Hvis du trenger mer, sjekk ut de fullstendige dokumentene. Dir.glob
med retur en matrise? eller, du kan sende den en blokk og få hver kamp en til og med.
# Husk, dette kjører på gjeldende katalog all_text_files = Dir.glob "* .txt" Dir.glob ("** / *. [A-z]") gjør | filnavn | # vil matche en hvilken som helst fil i en hvilken som helst barnekatalog med en enkelt utvidelsesendre med små bokstaver
I tillegg til boligfunksjoner kan du også gjøre en forekomst av dir
klasse. Du sender det navnet på katalogen du vil bruke; som med alle funksjoner som tar en bane, kan det være absolutt eller relativt.
reciepts = Dir.new "reciepts" meg = Dir.open "/ users / andrew"
Både ny
og åpen
returnere a dir
gjenstand; Det er imidlertid en annen måte å bruke åpen
:
Dir.open "/ users / andrew" do | dir | # bruk den her slutten
Dette er en vanlig konvensjon med mange klasser i Ruby; i stedet for å lagre dir
objekt i en variabel, kan du sende den til en blokk og bruke den inn derfra. Det er en ganske annen kodestil som jeg ikke har sett på noe annet språk, men det er ganske fint, bare du blir vant til det.
Det er en god sjanse for at når du oppretter en dir
objekt, du vil jobbe med innholdet i det. Det er noen måter å gjøre det på.
Forutsatt en_katalog
er dir
gjenstand,
some_dir.each do | file | # Gjør noe slutt
Du kan bruke Hver
metode på dir
objekter å iterere over hver fil eller katalog som er inne i den. Legg merke til at du ikke får en Fil
eller dir
gjenstand; bare en streng med navnet på den; Hvis du vil gjøre mer, må du selv ordne det aktuelle objektet.
Hvis du bare vil se hva som er inne i en katalog, kan du bruke innganger
eiendom, for å få en rekke innhold:
some_dir.entries # [".", "?", "file_one.txt", "another_directory"]
Som du vil notere ovenfor, inkluderer entires for en katalog?.? og ?? ?, peker det selv og sin overordnede katalog.
Ruby tilbyr også en nyttig API for å jobbe med filer.
Når du jobber med filer, kan du finne deg selv som ønsker å få den absolutte banen til en. De Fil
klassen tilbyr akkurat det du trenger:
File.absotule_path "plans.txt" # => "/users/andrew/Documents/plans.txt"
Men hva med den andre veien? Du har den absolutte banen, og du vil bare ha filnavnet? Bruk i stedet basename
File.basename ("/ users / andrew / Documents / plans.txt") # => "plans.txt" File.basename ("/ users / andrew / Documents / plans.txt", ".txt") # => "planer"
Hvis du sender en andre strengparameter, vil metoden se etter den aktuelle strengen på slutten av filnavnet, og fjerne den hvis den er der. dette trenger ikke å være filtypen, men det er den åpenbare hovedbruken for dette.
Den åpenbare bruken av dette er å slette filen du passerer inn i metoden:
File.delete "code.rb"
Dette er en nyttig en; si at du er Hver
-ing over oppføringene av a dir
objekt, men du vil bare håndtere filer. De File.directory?
metoden kommer tilbake ekte
Hvis strengparameteren du overfører til den, er en katalog, og falsk
hvis det er en fil.
Dir.open (Dir.pwd) .gjøre | filnavn | neste hvis File.directory? filnavn # ellers, behandle filslutten
Denne brikken åpen
s den nåværende katalogen og sender en blokk til Hver
metode. De Hver
metode passerer oppføringene av katalog en etter en til blokken. Den første linjen inne i blokken kan forvirre deg litt hvis du ikke er vant til Ruby, men se nøye på det. Den eneste delen du ikke er kjent med er neste
søkeord, som hopper over resten av blokken og går til neste iterasjon av den. Så, sier vi,? Gå til neste oppføring hvis oppføringen vi har for øyeblikket er en katalog. Hvis det ikke er en katalog, kan vi gjøre hva vi vil.
Gjør forekomster av Fil
klassen fungerer akkurat som med dir
; File.new
returnerer a Fil
objekt, mens File.open
kan returnere det, eller sende det til en blokk. Du bør også sende en andre parameter, som bestemmer hvordan filen skal åpnes. Mesteparten av tiden vil du sannsynligvis bruke disse:
Så, hvilke metoder gjør en forekomst av Fil
gi deg? Vel, disse metodene kommer faktisk fra IO
klasse, hvorav Fil
arver. Mesteparten av tiden åpner du en fil for å lese eller skrive innhold fra det, så la oss se på den funksjonaliteten.
Før vi kommer i gang, husk dette: Slik fungerer en fil, når en linje er lest, vises den ikke igjen; du jobber deg gjennom filen. På et hvilket som helst tidspunkt kan du bruke f.rewind
metode for å gå tilbake til begynnelsen av filen.
Hvis du bare vil lese hele greia, kan du gjøre det med lese
.
f = File.open ("sample.txt", "r") # antar denne filen for de neste par utklippene f.read # => "noe \ nline 2 \ na tredje \ nfour! \ n5555 \ nsixy \ nsevenly \ neight"
Imidlertid vil du sannsynligvis lese en linje om gangen; å gjøre det, bruk metoden readline
:
f.readind # tilbake i begynnelsen f.readline # "noe \ n" f.readline # "linje 2 \ n" f.readline # "en tredje \ n"
Du kan også bruke metoden blir
i stedet for readline
.
Det er også en readlines
metode, som returnerer en matrise der linjene som oppføringer:
f.readind f.readlines # => ["noe \ n", "linje 2 \ n", "en tredje \ n", "fire! \ n", "5555 \ n", "sixy \ n" syv \ n "," åtte "]
Til slutt kan du bruke Hver
, og pass en blokk til metoden for å arbeide med hver linje, en etter en
f.rewind f.each | line | setter linjens ende
For å skrive har du to alternativer: skrive
og puts
. Hovedforskjellen er det puts
legger til en linjeskift på slutten av strengen din, mens skrive
gjør ikke.
f = File.open ("file.txt", "w +") f.puts "first line" f.write "second" f.write "linje" f.rewind f.readlines # => ["første linje \ n ", "andre linje"]
Vel, det er det for Ruby For Newbies, Leksjon 7. Det er mer å oppdage i dir
og Fil
klasser; sjekk ut dokumentene for Dir, File og IO for mer (IO-klassen er hvor File erverver sine instansmetoder fra).
Jeg er imidlertid nysgjerrig på hvor du vil at denne serien skal gå herfra: Vil du fortsette med Ruby-språket, eller vil du bevege deg mot å bruke Ruby på nettet? Begge retninger vil være verdifulle for deg som webutvikler, så stem din mening i kommentarene!