Elixir - Archivo IO
File IO es una parte integral de cualquier lenguaje de programación, ya que permite que el lenguaje interactúe con los archivos del sistema de archivos. En este capítulo, discutiremos dos módulos: Ruta y Archivo.
El módulo de ruta
los pathmodule es un módulo muy pequeño que puede considerarse como un módulo auxiliar para las operaciones del sistema de archivos. La mayoría de las funciones del módulo Archivo esperan rutas como argumentos. Más comúnmente, esas rutas serán binarios regulares. El módulo de ruta proporciona facilidades para trabajar con dichas rutas. Se prefiere usar funciones del módulo Path en lugar de simplemente manipular binarios, ya que el módulo Path se ocupa de diferentes sistemas operativos de forma transparente. Se debe observar que Elixir convertirá automáticamente barras (/) en barras invertidas (\) en Windows al realizar operaciones con archivos.
Consideremos el siguiente ejemplo para comprender mejor el módulo Path:
IO.puts(Path.join("foo", "bar"))
Cuando se ejecuta el programa anterior, produce el siguiente resultado:
foo/bar
Hay muchos métodos que proporciona el módulo de ruta. Puedes echar un vistazo a los diferentes métodos aquí . Estos métodos se utilizan con frecuencia si está realizando muchas operaciones de manipulación de archivos.
El módulo de archivos
El módulo de archivos contiene funciones que nos permiten abrir archivos como dispositivos IO. De forma predeterminada, los archivos se abren en modo binario, lo que requiere que los desarrolladores utilicen elIO.binread y IO.binwritefunciones desde el módulo IO. Creemos un archivo llamadonewfile y escribirle algunos datos.
{:ok, file} = File.read("newfile", [:write])
# Pattern matching to store returned stream
IO.binwrite(file, "This will be written to the file")
Si va a abrir el archivo en el que acabamos de escribir, el contenido se mostrará de la siguiente manera:
This will be written to the file
Ahora entendamos cómo usar el módulo de archivos.
Abrir un archivo
Para abrir un archivo, podemos usar cualquiera de las siguientes 2 funciones:
{:ok, file} = File.open("newfile")
file = File.open!("newfile")
Entendamos ahora la diferencia entre File.open función y la File.open!() función.
los File.openLa función siempre devuelve una tupla. Si el archivo se abre correctamente, devuelve el primer valor de la tupla como:oky el segundo valor es literal de tipo io_device. Si se produce un error, devolverá una tupla con el primer valor como:error y el segundo valor como motivo.
los File.open!() función, por otro lado, devolverá un io_devicesi el archivo se abre correctamente, de lo contrario, generará un error. NOTA: Este es el patrón seguido en todas las funciones del módulo de archivos que vamos a discutir.
También podemos especificar los modos en los que queremos abrir este archivo. Para abrir un archivo como solo lectura y en modo de codificación utf-8, usamos el siguiente código:
file = File.open!("newfile", [:read, :utf8])
Escribir en un archivo
Tenemos dos formas de escribir en archivos. Veamos el primero usando la función de escritura del módulo Archivo.
File.write("newfile", "Hello")
Pero esto no debe usarse si está realizando múltiples escrituras en el mismo archivo. Cada vez que se invoca esta función, se abre un descriptor de archivo y se genera un nuevo proceso para escribir en el archivo. Si está haciendo varias escrituras en un bucle, abra el archivo a través deFile.openy escribir en él usando los métodos del módulo IO. Consideremos un ejemplo para entender lo mismo:
#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")
Puede utilizar otros métodos de módulo IO como IO.write y IO.binwrite para escribir en archivos abiertos como io_device.
Leer de un archivo
Tenemos dos formas de leer archivos. Veamos el primero usando la función de lectura del módulo Archivo.
IO.puts(File.read("newfile"))
Al ejecutar este código, debería obtener una tupla con el primer elemento como :ok y el segundo como el contenido de newfile
También podemos utilizar el File.read! función para obtener el contenido de los archivos que se nos devuelven.
Cerrar un archivo abierto
Siempre que abra un archivo usando la función File.open, una vez que haya terminado de usarlo, debe cerrarlo usando el File.close función -
File.close(file)