Ruby pentru începători Lucrul cu directoare și fișiere

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.

я


Vizualizați ecranul


Directoare

PWD

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.

chdir

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

glob

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

nou & deschis

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.

fiecare

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.

intrări

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.


Fișiere

Ruby oferă, de asemenea, un API util pentru lucrul cu fișiere.

absolute_path

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"

basename

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.

șterge

Utilizarea evidentă a acestui lucru este de a șterge fișierul pe care îl introduceți în metodă:

File.delete "code.rb"

director?

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

nou & deschis

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:

  • ?r? : numai pentru citire
  • ?w? : numai pentru scriere (suprascrie orice în fișier, dacă fișierul există)
  • ?w +? : citiți și scrieți (suprascrie orice în fișier, dacă fișierul există)
  • ?A? : numai pentru scriere (începe de la sfârșitul fișierului, dacă fișierul există)

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.

Citind

Î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

Scris

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

Întrebare pentru tine

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

Cod