Elixir - Arquivo IO
O File IO é parte integrante de qualquer linguagem de programação, pois permite que a linguagem interaja com os arquivos no sistema de arquivos. Neste capítulo, discutiremos dois módulos - Caminho e Arquivo.
O Módulo Path
o pathmodule é um módulo muito pequeno que pode ser considerado um módulo auxiliar para operações do sistema de arquivos. A maioria das funções no módulo Arquivo espera caminhos como argumentos. Mais comumente, esses caminhos serão binários regulares. O módulo Path fornece recursos para trabalhar com esses caminhos. Usar funções do módulo Path em vez de apenas manipular binários é preferível, pois o módulo Path cuida de diferentes sistemas operacionais de forma transparente. Deve-se observar que Elixir irá converter automaticamente barras (/) em barras invertidas (\) no Windows ao executar operações de arquivo.
Vamos considerar o exemplo a seguir para entender melhor o módulo Path -
IO.puts(Path.join("foo", "bar"))
Quando o programa acima é executado, ele produz o seguinte resultado -
foo/bar
Existem vários métodos que o módulo de caminho fornece. Você pode dar uma olhada nos diferentes métodos aqui . Esses métodos são freqüentemente usados se você estiver executando muitas operações de manipulação de arquivo.
O Módulo de Arquivo
O módulo de arquivo contém funções que nos permitem abrir arquivos como dispositivos IO. Por padrão, os arquivos são abertos em modo binário, o que requer que os desenvolvedores usem oIO.binread e IO.binwritefunções do módulo IO. Vamos criar um arquivo chamadonewfile e escrever alguns dados nele.
{:ok, file} = File.read("newfile", [:write])
# Pattern matching to store returned stream
IO.binwrite(file, "This will be written to the file")
Se você abrir o arquivo que acabamos de escrever, o conteúdo será exibido da seguinte maneira -
This will be written to the file
Vamos agora entender como usar o módulo de arquivo.
Abrindo um arquivo
Para abrir um arquivo, podemos usar qualquer uma das 2 funções a seguir -
{:ok, file} = File.open("newfile")
file = File.open!("newfile")
Vamos agora entender a diferença entre o File.open função e o File.open!() função.
o File.openfunção sempre retorna uma tupla. Se o arquivo for aberto com sucesso, ele retorna o primeiro valor na tupla como:oke o segundo valor é literal do tipo io_device. Se um erro for causado, ele retornará uma tupla com o primeiro valor como:error e o segundo valor como o motivo.
o File.open!() por outro lado, retornará um io_devicese o arquivo for aberto com sucesso, outro erro será gerado. NOTA: Este é o padrão seguido em todas as funções do módulo de arquivo que iremos discutir.
Também podemos especificar os modos em que queremos abrir este arquivo. Para abrir um arquivo como somente leitura e no modo de codificação utf-8, usamos o seguinte código -
file = File.open!("newfile", [:read, :utf8])
Gravando em um Arquivo
Temos duas maneiras de gravar arquivos. Vejamos o primeiro usando a função de gravação do módulo Arquivo.
File.write("newfile", "Hello")
Mas isso não deve ser usado se você estiver fazendo várias gravações no mesmo arquivo. Cada vez que essa função é chamada, um descritor de arquivo é aberto e um novo processo é gerado para gravar no arquivo. Se você estiver fazendo várias gravações em um loop, abra o arquivo viaFile.opene escreva nele usando os métodos do módulo IO. Vamos considerar um exemplo para entender o mesmo -
#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")
Você pode usar outros métodos do módulo IO, como IO.write e IO.binwrite para gravar em arquivos abertos como io_device.
Lendo de um arquivo
Temos duas maneiras de ler arquivos. Vamos ver o primeiro usando a função de leitura do módulo Arquivo.
IO.puts(File.read("newfile"))
Ao executar este código, você deve obter uma tupla com o primeiro elemento como :ok e o segundo como o conteúdo de newfile
Também podemos usar o File.read! função apenas para obter o conteúdo dos arquivos retornados para nós.
Fechando um arquivo aberto
Sempre que você abrir um arquivo usando a função File.open, após terminar de usá-lo, você deve fechá-lo usando o File.close função -
File.close(file)