Ruby for Newbies Arbeide med kataloger og filer

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.

я


Se Screencast


kataloger

pwd

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.

chdir

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.

glob

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

ny og åpen

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

Hver

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.

innganger

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.


filer

Ruby tilbyr også en nyttig API for å jobbe med filer.

absolute_path

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"

basename

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.

slette

Den åpenbare bruken av dette er å slette filen du passerer inn i metoden:

File.delete "code.rb"

katalog?

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 åpens 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.

ny og åpen

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:

  • ?r? : skrivebeskyttet
  • ?w? : skrivebeskyttet (overskriver noe i filen, hvis filen eksisterer)
  • ?w +? : les og skriv (overskriver noe i filen, hvis filen eksisterer)
  • ?en? : skrivebeskyttet (starter på slutten av filen, hvis filen eksisterer)

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.

Lesning

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

skrive

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

Spørsmål til deg

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!