Una delle funzionalità più utilizzata è sicuramente la gestione dei file che in alcuni linguaggi è una delle esperienze più frustranti per il programmatore inesperto; fortunatamente non è il caso di Ruby che anche in questo frangente mantiene una grande immediatezza e semplicità.
A questo punto il lettore avrà notato che qualsiasi argomento in Ruby non presenta mai un'elevata difficoltà ma è tutto molto intuitivo e di conseguenza risulta anche molto naturale. Una delle descrizioni più appropriate lette in giro dice che "imparare Ruby non è come scalare una montagna, ma è più come esplorare una pianura; ad ogni argomento ne segue un altro, ma nessuno porta con se grandi difficoltà".
Torniamo alle cose pratiche e vediamo quali metodi offre la classe File per eseguire le operazioni base sui file: apertura, chiusura, lettura e scrittura.
Apertura e chiusura di un file
Come è consueto per operare sul contenuto di un file occorre prima di tutto aprirlo. Il Ruby per farlo mette a disposizione due metodi. Innanzitutto c'è il classico File.new
, dove File
è ovviamente la classe che si occupa dei file ed ha come superclasse IO, quindi si ha ad esempio:
mio_file = File.new("test.txt", "r+")
fatto questo tutte le operazioni vanno fatte sull'oggetto mio_file
di tipo File
. Alla fine dopo averlo opportunamente processato il file va chiuso con:
mio_file = File.close("test.txt", "r+")
File.new può prendere da uno a tre argomenti, il primo rappresenta il nome del file da aprire, il secondo la modalità di apertura e il terzo i permessi da associare al file. La modalità di apertura può essere espressa sia come stringa sia come "or" di flag. Tra le principali flag, che sono costanti della classe File, troviamo:
- APPEND: apertura in modalità append
- CREAT: se il file da aprire non esiste viene creato
- RDONLY: apertura a sola lettura
- RDWR: apertura per lettura e scrittura
- TRUNC: apre il file e lo azzera se già esiste
- WRONLY: apertura a sola lettura
Analogamente alle flag è possibile usare le stringhe:
- r: apertura a sola lettura
- r+: apertura per lettura e scrittura dall'inizio del file
- w: apertura a sola scrittura, se il file non esiste ne viene creato uno nuovo, altrimenti viene azzerato
- w+: apertura per lettura e scrittura, se il file non esiste ne viene creato uno nuovo, altrimenti viene azzerato
- a: apertura a sola scrittura dalla fine del file, se il file non esiste viene creato
- a+: apertura per lettura e scrittura dalla fine del file, se il file non esiste viene creato
- b: va aggiunto ad uno dei precedenti e permette la gestione in modalità binaria, esiste solo per sistemi Windows.
I permessi, come terzo argomento, vanno indicati, nei sistemi Unix-like, nella classica forma Owner-Group-Other.
Oltre alla modalità classica di apertura, con la coppia new/close, il Ruby permette di aprire un file anche con il metodo open
. A differenza di new
a open
può essere associato un blocco al quale viene passato il file appena aperto come parametro:
File.open("test.txt", "r+") do |mio_file| ... end
Utilizzando open
non c'è più bisogno di chiamare al termine delle operazioni close
poiché il file viene chiuso automaticamente all'uscita dal blocco; open
può anche essere invocato senza blocco e in tal caso è solo un sinonimo di new
e valgono per esso tutte le considerazioni fatte in precedenza.