Ferrugem - Entrada / Saída de Arquivo

Além de ler e gravar no console, o Rust permite ler e gravar arquivos.

A estrutura de arquivo representa um arquivo. Ele permite que um programa execute operações de leitura e gravação em um arquivo. Todos os métodos na estrutura de Arquivo retornam uma variante da enumeração io :: Result.

Os métodos comumente usados ​​da estrutura de arquivo estão listados na tabela abaixo -

Sr. Não Módulo Método Assinatura Descrição
1 std :: fs :: File abrir() pub fn open <P: AsRef> (caminho: P) -> Resultado O método open static pode ser usado para abrir um arquivo no modo somente leitura.
2 std :: fs :: File crio() pub fn create <P: AsRef> (caminho: P) -> Resultado O método estático abre um arquivo no modo somente gravação. Se o arquivo já existia, o conteúdo antigo é destruído. Caso contrário, um novo arquivo será criado.
3 std :: fs :: remove_file remover arquivo() pub fn remove_file <P: AsRef> (caminho: P) -> Resultado <()> Remove um arquivo do sistema de arquivos. Não há garantia de que o arquivo será excluído imediatamente.
4 std :: fs :: OpenOptions acrescentar() pub fn append (& mut self, append: bool) -> & mut OpenOptions Define a opção para o modo de acréscimo do arquivo.
5 std :: io :: Writes write_all () fn write_all (& mut self, buf: & [u8]) -> Resultado <()> Tenta gravar um buffer inteiro nesta gravação.
6 std :: io :: Read read_to_string () fn read_to_string (& mut self, buf: & mut String) -> Resultado Lê todos os bytes até EOF nesta fonte, acrescentando-os ao buf.

Gravar em um arquivo

Vejamos um exemplo para entender como escrever um arquivo.

O programa a seguir cria um arquivo 'data.txt'. O método create () é usado para criar um arquivo. O método retorna um identificador de arquivo se o arquivo for criado com êxito. A função write_all da última linha gravará bytes no arquivo recém-criado. Se alguma das operações falhar, a função expect () retornará uma mensagem de erro.

use std::io::Write;
fn main() {
   let mut file = std::fs::File::create("data.txt").expect("create failed");
   file.write_all("Hello World".as_bytes()).expect("write failed");
   file.write_all("\nTutorialsPoint".as_bytes()).expect("write failed");
   println!("data written to file" );
}

Resultado

data written to file

Ler de um arquivo

O programa a seguir lê o conteúdo de um arquivo data.txt e o imprime no console. A função "abrir" é usada para abrir um arquivo existente. Um caminho absoluto ou relativo para o arquivo é passado para a função open () como parâmetro. A função open () lança uma exceção se o arquivo não existir ou se não estiver acessível por qualquer motivo. Se for bem-sucedido, um identificador de arquivo para tal arquivo é atribuído à variável "arquivo".

A função "read_to_string" do identificador "arquivo" é usada para ler o conteúdo desse arquivo em uma variável de string.

use std::io::Read;

fn main(){
   let mut file = std::fs::File::open("data.txt").unwrap();
   let mut contents = String::new();
   file.read_to_string(&mut contents).unwrap();
   print!("{}", contents);
}

Resultado

Hello World
TutorialsPoint

Excluir um arquivo

O exemplo a seguir usa a função remove_file () para excluir um arquivo. A função expect () retorna uma mensagem personalizada caso ocorra um erro.

use std::fs;
fn main() {
   fs::remove_file("data.txt").expect("could not remove file");
   println!("file is removed");
}

Resultado

file is removed

Anexar dados a um arquivo

A função append () grava dados no final do arquivo. Isso é mostrado no exemplo abaixo -

use std::fs::OpenOptions;
use std::io::Write;

fn main() {
   let mut file = OpenOptions::new().append(true).open("data.txt").expect(
      "cannot open file");
   file.write_all("Hello World".as_bytes()).expect("write failed");
   file.write_all("\nTutorialsPoint".as_bytes()).expect("write failed");
   println!("file append success");
}

Resultado

file append success

Copiar um arquivo

O exemplo a seguir copia o conteúdo de um arquivo para um novo arquivo.

use std::io::Read;
use std::io::Write;

fn main() {
   let mut command_line: std::env::Args = std::env::args();
   command_line.next().unwrap();
   // skip the executable file name
   // accept the source file
   let source = command_line.next().unwrap();
   // accept the destination file
   let destination = command_line.next().unwrap();
   let mut file_in = std::fs::File::open(source).unwrap();
   let mut file_out = std::fs::File::create(destination).unwrap();
   let mut buffer = [0u8; 4096];
   loop {
      let nbytes = file_in.read(&mut buffer).unwrap();
      file_out.write(&buffer[..nbytes]).unwrap();
      if nbytes < buffer.len() { break; }
   }
}

Execute o programa acima como main.exe data.txt datacopy.txt . Dois argumentos de linha de comando são passados ​​durante a execução do arquivo -

  • o caminho para o arquivo de origem
  • o arquivo de destino