Elisir - File IO

File IO è parte integrante di qualsiasi linguaggio di programmazione in quanto consente al linguaggio di interagire con i file sul file system. In questo capitolo, discuteremo di due moduli: Path e File.

Il modulo Path

Il pathmodule è un modulo molto piccolo che può essere considerato come un modulo di supporto per le operazioni sul filesystem. La maggior parte delle funzioni nel modulo File si aspettano percorsi come argomenti. Più comunemente, quei percorsi saranno binari regolari. Il modulo Path fornisce servizi per lavorare con tali percorsi. È preferibile utilizzare le funzioni del modulo Path invece di manipolare i binari poiché il modulo Path si prende cura dei diversi sistemi operativi in ​​modo trasparente. È da notare che Elixir convertirà automaticamente le barre (/) in barre rovesciate (\) su Windows durante l'esecuzione di operazioni sui file.

Consideriamo il seguente esempio per comprendere ulteriormente il modulo Path:

IO.puts(Path.join("foo", "bar"))

Quando il programma di cui sopra viene eseguito, produce il seguente risultato:

foo/bar

Esistono molti metodi forniti dal modulo path. Puoi dare un'occhiata ai diversi metodi qui . Questi metodi vengono utilizzati frequentemente se si eseguono molte operazioni di manipolazione dei file.

Il modulo file

Il modulo file contiene funzioni che ci consentono di aprire file come IO Device. Per impostazione predefinita, i file vengono aperti in modalità binaria, che richiede agli sviluppatori di utilizzare lo specificoIO.binread e IO.binwritefunzioni dal modulo IO. Creiamo un file chiamatonewfile e scrivere alcuni dati su di esso.

{:ok, file} = File.read("newfile", [:write]) 
# Pattern matching to store returned stream
IO.binwrite(file, "This will be written to the file")

Se apri il file in cui abbiamo appena scritto, il contenuto verrà visualizzato nel modo seguente:

This will be written to the file

Vediamo ora come utilizzare il modulo file.

Apertura di un file

Per aprire un file, possiamo utilizzare una delle seguenti 2 funzioni:

{:ok, file} = File.open("newfile")
file = File.open!("newfile")

Cerchiamo ora di capire la differenza tra i file File.open funzione e il File.open!() funzione.

  • Il File.openfunzione restituisce sempre una tupla. Se il file viene aperto correttamente, restituisce il primo valore nella tupla come:oke il secondo valore è letterale di tipo io_device. Se viene causato un errore, restituirà una tupla con il primo valore come:error e secondo valore come motivo.

  • Il File.open!() la funzione d'altra parte restituirà un file io_devicese il file viene aperto con successo altrimenti verrà generato un errore. NOTA: questo è il modello seguito in tutte le funzioni del modulo file di cui parleremo.

Possiamo anche specificare le modalità in cui vogliamo aprire questo file. Per aprire un file in sola lettura e in modalità di codifica utf-8, utilizziamo il seguente codice:

file = File.open!("newfile", [:read, :utf8])

Scrittura su un file

Abbiamo due modi per scrivere su file. Vediamo il primo usando la funzione di scrittura dal modulo File.

File.write("newfile", "Hello")

Ma questo non dovrebbe essere usato se stai facendo più scritture sullo stesso file. Ogni volta che viene richiamata questa funzione, viene aperto un descrittore di file e viene generato un nuovo processo per scrivere sul file. Se stai facendo più scritture in un ciclo, apri il file tramiteFile.opene scrivere su di esso utilizzando i metodi nel modulo IO. Consideriamo un esempio per capire lo stesso:

#Open the file in read, write and utf8 modes. 
file = File.open!("newfile_2", [:read, :utf8, :write])

#Write to this "io_device" using standard IO functions
IO.puts(file, "Random text")

È possibile utilizzare altri metodi del modulo IO come IO.write e IO.binwrite per scrivere su file aperti come io_device.

Leggere da un file

Abbiamo due modi per leggere dai file. Vediamo il primo usando la funzione di lettura dal modulo File.

IO.puts(File.read("newfile"))

Quando esegui questo codice, dovresti ottenere una tupla con il primo elemento come :ok e il secondo come contenuto di newfile

Possiamo anche usare il File.read! funzione per ottenere solo il contenuto dei file restituiti.

Chiusura di un file aperto

Ogni volta che apri un file utilizzando la funzione File.open, dopo aver finito di usarlo, dovresti chiuderlo usando il File.close funzione -

File.close(file)