Ruby voor nieuwkomers werken met mappen en bestanden

Ruby is een van de populairste talen die op internet wordt gebruikt. We zijn onlangs een nieuwe sessie gestart op Nettuts + die u kennis laat maken met Ruby, evenals met de geweldige frameworks en tools die horen bij de ontwikkeling van Ruby. Vandaag zullen we kijken naar de dir en het dossier klassen, en hoe we ze kunnen gebruiken om met mappen en bestanden te werken.

я


Bekijk Screencast


directories

pwd

Als je veel werk hebt gedaan met de terminal (AKA-opdrachtregel, AKA-shell), weet je dat het de notie heeft van een huidige map, de werkdirectory. Dit is de map waarin u zich momenteel bevindt. Telkens wanneer u een opdracht typt die een bestand gebruikt, zal de werkmap de eerste plaats zijn waar uw shell zoekt om het bestand te vinden.

Ruby heeft een soortgelijk idee bij het uitvoeren van code. Het begrijpt de mappenstructuur van het besturingssysteem en heeft een aantal handige hulpmiddelen om ermee te werken.

Dus, hoe kom je erachter in welke map je denkt dat Ruby-script er in zit??

Dir.pwd # "/ Users / andrew / Documents"

De pwd (print werkmap) methode op de dir klas geeft ons die informatie. Als je er bent irb, uw werkdirectory is standaard de map die u hebt gestart irb in. Als je in een script zit, wordt de locatie waar je het script vanaf belt.

chdir

Als u de werkdirectory wilt wijzigen, gebruikt u de chdir methode; geef het het pad door naar de map waarnaar je wilt verplaatsen:

Dir.chdir "Documenten" Dir.chdir "/ users / andrew / Documents"

Zoals je ziet, kan de stringparameter een absoluut of een relatief pad zijn.

glob

Als u op zoek bent naar bepaalde bestanden in de werkdirectory (Dir.pwd), kunt u ze krijgen met behulp van de Dir.glob methode. Geef die methode a? Glob? dat is een zoekpatroon dat ergens tussen een statische tekenreeks en een volledige reguliere expressie ligt. U kunt een asterisk gebruiken * als een wildcard, net zoals je zou kunnen in de shell; je kunt een dubbel sterretje gebruiken ** om mappen recursief overeen te laten komen. U kunt sets ook tussen vierkante haken gebruiken, net als bij reguliere expressies. Als je meer nodig hebt, bekijk dan de volledige documentatie. Dir.glob met een array terug? of je kunt het een blok geven en elke wedstrijd een voor een krijgen.

# Onthoud dat dit in de huidige map draait all_text_files = Dir.glob "* .txt" Dir.glob ("** / *. [A-z]") do | filename | # komt overeen met elk bestand in elke onderliggende map met een extensie van één kleine letter extensie

nieuw en open

Naast het huisvesten van nuttige functies, kunt u ook een instantie van de dir klasse. U geeft het de naam door van de map die u wilt gebruiken; zoals bij alle functies die een pad volgen, kan deze absoluut of relatief zijn.

reciepts = Dir.new "reciept" me = Dir.open "/ users / andrew"

Beide nieuwe en Open terugkeer a dir voorwerp; er is echter een andere manier om te gebruiken Open:

Dir.open "/ users / andrew" do | dir | # gebruik het hier einde

Dit is een veel voorkomende afspraak met veel ruby-klassen; in plaats van de dir object in een variabele, je kunt het doorgeven aan een blok en het daar gebruiken. Het is een behoorlijk andere stijl van coderen die ik in geen enkele andere taal heb gezien, maar het is best aardig, alleen jij went eraan.

De kans is groot dat wanneer u een dir object, wil je met de inhoud ervan werken. Er zijn een paar manieren om dat te doen.

elk

Ervan uitgaande dat some_dir is dir voorwerp,

some_dir.each do | file | # doe iets dat eindigt

U kunt de elk methode op dir objecten om te itereren over elk bestand of elke map die zich erin bevindt. Merk op dat u geen krijgt het dossier of dir voorwerp; gewoon een string met de naam ervan; als je meer wilt doen, moet je het juiste object zelf maken.

entries

Als u alleen wilt zien wat zich in een directory bevindt, kunt u de entries eigenschap, om een ​​array van de inhoud te krijgen:

some_dir.entries # [".", "?", "file_one.txt", "another_directory"]

Zoals u hierboven opmerken, de entires voor een map omvatten?.? en ?? ?, wijzer het zelf en zijn bovenliggende map.


bestanden

Ruby biedt ook een handige API voor het werken met bestanden.

absolute_path

Wanneer u met bestanden werkt, merkt u misschien dat u het absolute pad van één wilt. De het dossier klasse biedt precies wat je nodig hebt:

File.absotule_path "plans.txt" # => "/users/andrew/Documents/plans.txt"

basename

Maar hoe zit het andersom? U hebt het absolute pad en u wilt alleen de bestandsnaam? Gebruik in plaats daarvan basename

File.basename ("/ users / andrew / Documents / plans.txt") # => "plans.txt" File.basename ("/ users / andrew / Documents / plans.txt", ".txt") # => "plannen"

Als u een parameter van de tweede reeks doorgeeft, zoekt de methode naar die tekenreeks aan het einde van de bestandsnaam en verwijdert deze als deze er is; dit hoeft niet de extensie te zijn, maar dat is het voor de hand liggende belangrijkste gebruik hiervoor.

verwijderen

Het voor de hand liggende gebruik hiervan is om het bestand dat u in de methode gebruikt te verwijderen:

File.delete "code.rb"

directory?

Dit is een nuttige; zeg dat je dat bent elk-ing bij de inzendingen van a dir object, maar u wilt alleen met bestanden omgaan. De File.directory? methode zal terugkeren waar als de stringparameter die u eraan geeft een map is, en vals als het een bestand is.

Dir.open (Dir.pwd) .Elle do | bestandsnaam | volgende als File.directory? bestandsnaam # anders, proces bestand einde

Dit fragment Opens de huidige map en geeft een blok door aan de elk methode. De elk methode geeft de vermeldingen van de map één voor één door aan het blok. Die eerste regel in het blok kan je een beetje verwarren als je Ruby niet gewend bent, maar bekijk het aandachtig. Het enige deel waar u niet bekend mee bent, is het volgende sleutelwoord, dat de rest van het blok overslaat en naar de volgende iteratie ervan gaat. Dus, we zeggen,? Ga naar het volgende item als het item dat we momenteel hebben een map is. Als het geen directory is, kunnen we doen wat we willen.

nieuw en open

Het maken van voorbeelden van de het dossier klasse werkt net hetzelfde als met dir; File.new geeft a terug het dossier object, terwijl File.open kan het retourneren of doorgeven aan een blok. U moet ook een tweede parameter doorgeven, die beslist hoe het bestand wordt geopend. Meestal zult u deze waarschijnlijk gebruiken:

  • ?r? : alleen lezen
  • ?w? : write-only (overschrijft alles in het bestand, als het bestand bestaat)
  • ?w +? : lezen en schrijven (overschrijft alles in het bestand, als het bestand bestaat)
  • ?een? : alleen-schrijven (begint aan het einde van het bestand, als het bestand bestaat)

Dus, welke methoden doet een instantie van het dossier geef je? Nou, deze methoden komen eigenlijk van de IO klas, waaruit het dossier erft. Meestal opent u een bestand om er inhoud van te lezen of te schrijven, dus laten we naar die functionaliteit kijken.

Lezing

Voordat we aan de slag gaan, onthoud dit: de manier waarop een bestand werkt, als een regel eenmaal is gelezen, wordt het niet meer getoond; je werkt je een weg door het bestand. Op elk moment kunt u de f.rewind methode om terug te gaan naar het begin van het bestand.

Als je alleen het hele verhaal wilt lezen, kun je dat doen met lezen.

f = File.open ("sample.txt", "r") # gaan dit bestand over voor de volgende paar fragmenten f.read # => "something \ nline 2 \ na third \ nfour! \ n5555 \ nsixy \ nsevenly \ Neight"

U zult waarschijnlijk waarschijnlijk één regel tegelijk willen lezen; om dat te doen, gebruik de methode Lees regel:

f.rewind # terug aan het begin f.readline # "iets \ n" f.readline # "regel 2 \ n" f.readline # "een derde \ n"

Je zou ook de methode kunnen gebruiken krijgt in plaats van Lees regel.

Er is ook een readlines methode, die een array retourneert waarin de regels als items worden weergegeven:

f.rewind f.readlines # => ["iets \ n", "regel 2 \ n", "een derde \ n", "vier! \ n", "5555 \ n", "sixy \ n", " sevenly \ n "," eight "]

Eindelijk, je kunt gebruiken elk, en geef een blok aan de methode om met elke regel een voor een te werken

f.rewind f.each do | line | zet lijn einde

schrift

Voor schrijven heb je twee opties: schrijven en puts. Het grootste verschil is dat puts voegt een regel afbreking toe aan het einde van uw string, terwijl schrijven doet niet.

f = File.open ("file.txt", "w +") f.puts "eerste regel" f.write "tweede" f.write "regel" f.rewind f.readlines # => ["eerste regel \ n ", "tweede lijn"]

Vraag voor jou

Nou, dat is het voor Ruby voor nieuwkomers, les 7. Er valt nog meer te ontdekken in de dir en het dossier klassen; bekijk de documenten voor Dir, File en IO voor meer (de IO-klasse is waar het bestand de instantiemethodes van overneemt).

Ik ben echter wel nieuwsgierig naar waar je deze serie wilt laten gaan: wil je doorgaan met de Ruby-taal, of wil je graag Ruby gebruiken op het web? Beide richtingen zullen waardevol voor u zijn als webontwikkelaar, dus vertel uw mening in de opmerkingen!