Ruby är ett av de mest populära språk som används på webben. Vi har nyligen startat en ny session här på Nettuts + som kommer att introducera dig till Ruby, liksom de stora ramarna och verktygen som följer med Ruby-utvecklingen. Idag ser vi på dir
och Fil
klasser och hur vi kan använda dem för att arbeta med kataloger och filer.
я
Om du har gjort mycket arbete med terminalen (AKA-kommandoraden, AKA-skal), vet du att den har uppfattningen om en aktuell katalog, kallad arbetsboken. Det här är den mapp du befinner dig i. När du skriver ett kommando som använder en fil blir arbetslistan det första stället som ditt skal ser ut att hitta filen.
Ruby har en liknande uppfattning när man kör kod. Det förstår operativsystemets mappstruktur och har några användbara verktyg för att arbeta med det.
Så, hur får du reda på vilken mapp du ruby script tycker att den är i?
Dir.pwd # "/ Users / andrew / Documents"
De pwd
(skriv arbetsbok) metod på dir
klass ger oss den informationen. Om du är i irb
, Din arbetsmapp kommer som standard - den mapp du startade irb
in. Om du befinner dig i ett skript kommer det att vara den plats du ringer skriptet från.
Om du vill ändra arbetsboken kan du använda chdir
metod; skicka den till sökvägen till katalogen du vill flytta till:
Dir.chdir "Dokument" Dir.chdir "/ users / andrew / Documents"
Som du kan se kan strängparametern vara antingen en absolut eller en relativ sökväg.
Om du letar efter vissa filer i arbetsboken (Dir.pwd
), kan du få dem genom att använda Dir.glob
metod. Passa den metoden a? Glob ?; Det är ett sökmönster som ligger någonstans mellan en statisk sträng och ett fullständigt regelbundet uttryck. Du kan använda en asterisk *
som ett jokertecken, precis som du kanske i skalet; du kan använda en dubbelstjärna **
att matcha kataloger rekursivt. Du kan också använda uppsättningar i kvadrat parentes som du skulle med regelbundna uttryck. Om du behöver mer, kolla in de fullständiga dokumenten. Dir.glob
med returnera en array? Eller, du kan skicka det ett block och få varje match en till och med.
# Kom ihåg att detta körs på den aktuella katalogen all_text_files = Dir.glob "* .txt" Dir.glob ("** / *. [A-z]") gör | filnamn | # kommer att matcha någon fil i någon barnkatalog med en enda förlängningsändring för små bokstäver
Förutom funktionella bostäder kan du också göra en förekomst av dir
klass. Du skickar det namnet på den katalog du vill använda; som med alla funktioner som tar en väg kan det vara absolut eller relativt.
reciepts = Dir.new "reciepts" me = Dir.open "/ users / andrew"
Både ny
och öppna
returnera a dir
objekt; Det finns dock ett annat sätt att använda öppna
:
Dir.open "/ users / andrew" gör | dir | # använd det här slut
Detta är en vanlig konvention med många klasser i Ruby; istället för att lagra dir
objekt i en variabel, du kan skicka det till ett block och använda det därifrån. Det är en ganska annorlunda kodning som jag inte har sett på något annat språk, men det är ganska trevligt, bara du blir van vid det.
Det finns en bra chans att när du skapar en dir
objekt, du vill arbeta med innehållet i det. Det finns några sätt att göra det.
Förutsatt some_dir
är dir
objekt,
some_dir.each do | file | # gör något slut
Du kan använda varje
metod på dir
objekt att iterera över varje fil eller katalog som finns inuti den. Observera att du inte får en Fil
eller dir
objekt; bara en sträng med namnet på den; om du vill göra mer måste du själv ordna det aktuella objektet.
Om du bara vill se vad som finns i en katalog kan du använda anteckningar
egendom, för att få en rad innehåll:
some_dir.entries # [".", "?", "file_one.txt", "another_directory"]
Som du noterar ovan innehåller entires för en katalog??? och ?? ?, peka det själv och dess föräldrakatalog.
Ruby erbjuder också ett användbart API för att arbeta med filer.
När du arbetar med filer kan du hitta dig själv som vill få den absoluta vägen för en. De Fil
klassen erbjuder exakt vad du behöver:
File.absotule_path "plans.txt" # => "/users/andrew/Documents/plans.txt"
Men hur är det med tvärtom? Du har den absoluta vägen, och du vill bara ha filnamnet? Använd istället basnamn
File.basename ("/ users / andrew / Documents / plans.txt") # => "plans.txt" File.basename ("/ users / andrew / Documents / plans.txt", ".txt") # => "planer"
Om du skickar en andra strängparameter, söker metoden efter den strängen i slutet av filnamnet och tar bort den om den finns där. Detta behöver inte vara filtillägget, men det är det uppenbara huvudanvändningen för detta.
Den uppenbara användningen av detta är att radera filen du skickar in i metoden:
File.delete "code.rb"
Detta är en användbar; säg att du är varje
-ing över inmatningarna av a dir
objekt, men du vill bara hantera filer. De File.directory?
Metoden kommer att återvända Sann
om strängparametern du skickar till den är en katalog och falsk
om det är en fil.
Dir.open (Dir.pwd) .each do | filnamn | nästa om File.directory? filnamn # annars, bearbeta filänden
Detta stycke öppna
s den aktuella katalogen och skickar ett block till varje
metod. De varje
Metoden skickar posterna i katalog en efter en till blocket. Den första raden inuti blocket kan förvirra dig lite om du inte är van vid Ruby, men titta noggrant på det. Den enda delen du inte känner till är Nästa
sökord som hoppar över resten av blocket och går till nästa iteration av det. Så säger vi,? Hoppa till nästa post om den post vi har för närvarande är en katalog. Om det inte är en katalog kan vi göra vad vi vill.
Göra instanser av Fil
klassen fungerar precis som med dir
; File.new
returnerar a Fil
objekt, medan File.open
kan returnera det eller skicka det till ett block. Du bör också skicka en andra parameter, vilken bestämmer hur filen öppnas. För det mesta brukar du använda dessa:
Så, vilka metoder gör en förekomst av Fil
ge dig? Jo, dessa metoder kommer faktiskt från IO
klass, från vilken Fil
ärver. För det mesta öppnar du en fil för att läsa eller skriva innehåll från det, så låt oss titta på den funktionen.
Innan vi börjar, kom ihåg det här: hur en fil fungerar, en gång en rad har lästs, det visas inte igen; Du jobbar dig igenom filen. På något ställe kan du använda f.rewind
metod för att gå tillbaka till början av filen.
Om du bara vill läsa hela saken kan du göra det med läsa
.
f = File.open ("sample.txt", "r") # antar den här filen för nästa par snippets f.read # => "something \ nline 2 \ na third \ nfour! \ n5555 \ nsixy \ nsevenly \ neight"
Men du kommer noga att läsa en rad i taget. för att göra det, använd metoden readline
:
f.readind # back i början f.readline # "något \ n" f.readline # "rad 2 \ n" f.readline # "en tredje \ n"
Du kan också använda metoden blir
istället för readline
.
Det finns också en readlines
metod som returnerar en array där raderna som poster:
f.readind f.readlines # => ["något \ n", "rad 2 \ n", "en tredje \ n", "four! \ n", "5555 \ n", "sixy \ n" sjukt \ n "," åtta "]
Slutligen kan du använda varje
, och skicka ett block till metoden för att arbeta med varje rad, en efter en
f.rewind f.each do | line | sätter linjeänden
För att skriva har du två alternativ: skriva
och sätter
. Huvudskillnaden är det sätter
lägger till en radbrytning till slutet av din sträng, medan skriva
gör inte.
f = File.open ("file.txt", "w +") f.puts "first line" f.write "second" f.write "linje" f.rewind f.readlines # => ["första raden \ n ", "andra linjen"]
Tja, det är det för Ruby For Newbies, Lektion 7. Det finns mer att upptäcka i dir
och Fil
klasser; kolla in docs för Dir, File och IO för mer (IO-klassen är där File ärverger sina förekomstmetoder från).
Jag är dock nyfiken på var du vill att den här serien ska gå härifrån: vill du fortsätta med Ruby-språket, eller vill du flytta dig mot att använda Ruby på webben? Båda riktningarna kommer att vara värdefulla för dig som webbutvecklare, så röst din åsikt i kommentarerna!