Ruby for Newbies Arbeta med kataloger och filer

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.

я


Visa skärmdump


Kataloger

pwd

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.

chdir

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.

glob

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

nya och öppna

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.

varje

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.

anteckningar

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.


filer

Ruby erbjuder också ett användbart API för att arbeta med filer.

absolute_path

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"

basnamn

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.

radera

Den uppenbara användningen av detta är att radera filen du skickar in i metoden:

File.delete "code.rb"

katalog?

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 öppnas 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.

nya och öppna

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:

  • ?r? : skrivskyddad
  • ?w? : skrivskyddad (skrivs över allt i filen, om filen finns)
  • ?w +? : läs och skriv (skrivs över allt i filen, om filen finns)
  • ?en? : skriv-bara (börjar i slutet av filen, om filen finns)

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.

Läsning

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

Skrift

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

Fråga till dig

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!