Ruby este una dintre cele mai populare limbi folosite pe web. Am început recent o nouă sesiune aici pe Nettuts +, care vă va prezenta Ruby, precum și marile cadre și instrumente care merg împreună cu dezvoltarea Ruby. Astăzi, ne vom uita la dir
și Fişier
clase și cum le putem folosi pentru a lucra cu directoare și fișiere.
я
Dacă ați lucrat mult cu terminalul (linia de comandă AKA, shell-ul AKA), veți ști că are noțiunea de director actual, numit directorul de lucru. Acesta este dosarul în care vă aflați în prezent. De fiecare dată când introduceți o comandă care utilizează un fișier, directorul de lucru va fi primul loc pe care shell-ul dvs. pare să îl găsească.
Ruby are o noțiune similară atunci când execută cod. Înțelege structura folderului sistemului de operare și are câteva instrumente utile pentru a lucra cu acesta.
Deci, cum aflați ce folder sunteți rubin script crede că este înăuntru?
Dir.pwd # "/ Utilizatori / andrew / Documents"
PWD
(imprimare director de lucru) pe dir
ne oferă această informație. Dacă vă aflați în IRB
, directorul de lucru va fi, implicit, folderul pe care l-ați început IRB
Dacă sunteți într-un scenariu, va fi locația la care apelați scriptul.
Dacă doriți să schimbați directorul de lucru, puteți utiliza funcția chdir
metodă; treceți calea spre directorul în care doriți să vă mutați:
Dir.chdir "Documente" Dir.chdir "/ utilizatori / andrew / Documente"
După cum puteți vedea, parametrul șir poate fi fie o cale absolută, fie una relativă.
Dacă căutați anumite fișiere din directorul de lucru (Dir.pwd
), puteți să le obțineți utilizând Dir.glob
metodă. Treceți această metodă? Glob ?; acesta este un model de căutare care este undeva între un șir static și o expresie regulată completă. Puteți utiliza un asterisc *
ca un wildcard, la fel ca în shell; puteți utiliza un asterisc dublu **
pentru a potrivi directoarele recursiv. De asemenea, puteți utiliza seturile în paranteze pătrate ca în cazul expresiilor obișnuite. Dacă aveți nevoie de mai multe, verificați documentele complete. Dir.glob
cu retur o matrice? sau, puteți să-i dați un bloc și să obțineți fiecare meci unul după altul.
# Amintiți-vă, acest lucru se execută pe directorul curent all_text_files = Dir.glob "* .txt" Dir.glob ("** / *. [A-z]") # va potrivi orice fișier din orice director de fișiere cu un singur capăt de extensie pentru litere mici
Pe lângă faptul că aveți funcții utile, puteți face și o instanță a funcției dir
clasă. Dă-i numele directorului pe care vrei să-l folosești; ca în cazul tuturor funcțiilor care iau o cale, poate fi absolută sau relativă.
reciepts = Dir.new "recietează" me = Dir.open "/ users / andrew"
Ambii nou
și deschis
returnați a dir
obiect; cu toate acestea, există o altă modalitate de a utiliza deschis
:
Dir.open "/ users / andrew" a face | dir | # utilizați aici aici sfârșitul
Aceasta este o convenție comună cu multe clase în Ruby; în loc să stocheze dir
obiect într-o variabilă, îl puteți trece într-un bloc și îl puteți folosi de acolo. Este un stil destul de diferit de codare pe care nu l-am văzut în nici o altă limbă, dar este destul de frumos doar să te obișnuiești cu asta.
Există o șansă bună atunci când creați o dir
obiect, veți dori să lucrați cu conținutul acestuia. Există câteva moduri de a face acest lucru.
presupunând some_dir
este dir
obiect,
some_dir.each do | file | # face ceva sfarsit
Puteți utiliza funcția fiecare
metoda pe dir
obiecte pentru a itera peste fiecare fișier sau director care se află în el. Rețineți că nu primiți a Fişier
sau dir
obiect; doar un șir cu numele acestuia; dacă doriți să faceți mai mult, va trebui să instanțiați singur obiectul corespunzător.
Dacă doriți doar să vedeți ce se află în interiorul unui director, puteți utiliza funcția intrări
proprietate, pentru a obține o gamă de conținut:
some_dir.entries # [".", "?", "file_one.txt", "another_directory"]
Așa cum veți nota mai sus, entitățile pentru un director includ. și ?? ?, indicați-l în sine și directorul părinte.
Ruby oferă, de asemenea, un API util pentru lucrul cu fișiere.
Când lucrați cu fișiere, puteți găsi că doriți să obțineți calea absolută a unuia. Fişier
clasa oferă exact ceea ce aveți nevoie:
File.absotule_path "plans.txt" # => "/users/andrew/Documents/plans.txt"
Dar ce zici de altfel? Ai calea absolută și vrei doar numele fișierului? În schimb, utilizați basename
File.basename ("/ users / andrew / Documents / plans.html") # => "planuri.txt" "planuri"
Dacă treceți un al doilea parametru șir, metoda va căuta acel șir la sfârșitul numelui fișierului și îl va șterge dacă este acolo; acest lucru nu trebuie să fie extensia de fișier, dar asta este folosirea principală evidentă pentru acest lucru.
Utilizarea evidentă a acestui lucru este de a șterge fișierul pe care îl introduceți în metodă:
File.delete "code.rb"
Acesta este unul util; spuneți că sunteți fiecare
-cu privire la intrările de a dir
obiect, dar doriți doar să vă ocupați de fișiere. File.directory?
metoda va reveni Adevărat
dacă parametrul de șir pe care îl transmiteți este un director și fals
dacă este un fișier.
Dir.open (Dir.pwd) .există | numele fișierului următor dacă File.directory? nume fișier # altfel, terminarea fișierului de proces
Acest fragment deschis
este directorul curent și trece un bloc la fiecare
metodă. fiecare
metoda trece intrările din directorul unul câte unul în bloc. Această primă linie din interiorul blocului te poate deruta puțin dacă nu ești obișnuit cu Ruby, dar privește cu atenție. Singura parte cu care nu cunoașteți este Următor →
, care trece peste restul blocului și trece la următoarea repetare a acestuia. Deci, spunem, "treceți la intrarea următoare dacă înregistrarea pe care o avem în prezent este un director. Dacă nu este un director, putem face tot ce ne dorim.
Efectuarea de instanțe ale Fişier
clasa funcționează la fel ca și cu dir
; File.new
returnează a Fişier
obiect, în timp ce File.open
îl poate returna sau îl poate transfera într-un bloc. De asemenea, trebuie să treci un al doilea parametru, care decide cum va fi deschis fișierul. De cele mai multe ori, veți folosi probabil aceste:
Deci, ce metode are un exemplu de Fişier
iti dau? Ei bine, aceste metode vin de fapt din IO
clasa, din care Fişier
moștenește. De cele mai multe ori, veți deschide un fișier pentru a citi sau a scrie conținut de la el, așa că haideți să ne uităm la acea funcționalitate.
Înainte de a începe, amintiți-vă: modul în care funcționează un fișier, odată ce o linie a fost citită, nu se mai arată; lucrați prin fișier. În orice moment, puteți utiliza funcția f.rewind
pentru a reveni la începutul fișierului.
Dacă vrei să citești totul, poți să o faci citit
.
f = fișier.open ("sample.txt", "r") # își asumă acest fișier pentru următoarele două fragmente f.read # => "ceva \ nline2 \ n al treilea \ nfour! \ n5555 \ nsixy \ nsevenly \ neight“
Cu toate acestea, probabil că veți dori să citiți câte o linie pe rând; pentru a face acest lucru, utilizați metoda Citeste linia
:
f.readline # "înapoi la început f.readline #" ceva \ n "f.readline #" rândul 2 \ n "f.readline #" o treime \ n "
De asemenea, puteți utiliza metoda devine
in loc de Citeste linia
.
Există și a readlines
, care returnează o matrice în care liniile ca intrări:
fi.readlines # => ["ceva \ n", "linia 2 \ n", "o treime \ n", " șapte \ n "," opt "]
În cele din urmă, puteți folosi fiecare
, și să treacă un bloc la metoda de a lucra cu fiecare linie, unul câte unul
f.rewind f.each do | line | pune capăt liniei
Pentru scris, aveți două opțiuni: scrie
și puts
. Principala diferență este aceea puts
adaugă o pauză de linie la sfârșitul șirului dvs., în timp ce scrie
nu.
f = fișier.open ("file.txt", "w +") f.puts "prima linie" f.write "a doua" f.write "linie" f.rewind f.readlines # => [ ", "a doua linie"]
Ei bine, asta este pentru Ruby For Newbies, Lecția 7. Mai sunt multe de descoperit în dir
și Fişier
clase; verificați docs-urile pentru Dir, File și IO pentru mai multe (clasa IO este locul în care fișierul moștenește metodele instanței sale).
Cu toate acestea, sunt curios de unde doriți ca această serie să meargă de aici: doriți să continuați cu limba Ruby sau doriți să vă deplasați spre utilizarea Ruby pe web? Ambele direcții vor fi valoroase pentru dvs. ca dezvoltator web, deci vă exprimați opinia în comentariile dvs.!