Rust - Entrada / Salida de archivos

Además de leer y escribir en la consola, Rust permite leer y escribir en archivos.

La estructura File representa un archivo. Permite que un programa realice operaciones de lectura y escritura en un archivo. Todos los métodos de la estructura File devuelven una variante de la enumeración io :: Result.

Los métodos más utilizados de la estructura File se enumeran en la siguiente tabla:

No Señor Módulo Método Firma Descripción
1 std :: fs :: Archivo abierto() pub fn open <P: AsRef> (ruta: P) -> Resultado El método estático abierto se puede utilizar para abrir un archivo en modo de solo lectura.
2 std :: fs :: Archivo crear() pub fn crear <P: AsRef> (ruta: P) -> Resultado El método estático abre un archivo en modo de solo escritura. Si el archivo ya existía, el contenido antiguo se destruye. De lo contrario, se crea un nuevo archivo.
3 std :: fs :: remove_file Remover archivo() pub fn remove_file <P: AsRef> (ruta: P) -> Resultado <()> Elimina un archivo del sistema de archivos. No hay garantía de que el archivo se elimine inmediatamente.
4 std :: fs :: OpenOptions adjuntar() pub fn append (& mut self, append: bool) -> & mut OpenOptions Establece la opción para el modo de archivo adjunto.
5 std :: io :: Escribe write_all () fn write_all (& mut self, buf: & [u8]) -> Resultado <()> Intenta escribir un búfer completo en esta escritura.
6 std :: io :: Leer read_to_string () fn read_to_string (& mut self, buf: & mut String) -> Resultado Lee todos los bytes hasta EOF en esta fuente, agregándolos a buf.

Escribir en un archivo

Veamos un ejemplo para entender cómo escribir un archivo.

El siguiente programa crea un archivo 'data.txt'. El método create () se utiliza para crear un archivo. El método devuelve un identificador de archivo si el archivo se crea correctamente. La última línea de la función write_all escribirá bytes en el archivo recién creado. Si alguna de las operaciones falla, la función wait () devuelve un mensaje de error.

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" );
}

Salida

data written to file

Leer de un archivo

El siguiente programa lee el contenido en un archivo data.txt y lo imprime en la consola. La función "abrir" se utiliza para abrir un archivo existente. Una ruta absoluta o relativa al archivo se pasa a la función open () como parámetro. La función open () genera una excepción si el archivo no existe o si no es accesible por cualquier motivo. Si tiene éxito, se asigna un identificador de archivo a dicho archivo a la variable "archivo".

La función "read_to_string" del identificador "file" se usa para leer el contenido de ese archivo en una variable de cadena.

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);
}

Salida

Hello World
TutorialsPoint

Eliminar un archivo

El siguiente ejemplo usa la función remove_file () para eliminar un archivo. La función wait () devuelve un mensaje personalizado en caso de que ocurra un error.

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

Salida

file is removed

Agregar datos a un archivo

La función append () escribe datos al final del archivo. Esto se muestra en el ejemplo que se muestra a continuación:

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");
}

Salida

file append success

Copiar un archivo

El siguiente ejemplo copia el contenido de un archivo en un archivo nuevo.

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; }
   }
}

Ejecute el programa anterior como main.exe data.txt datacopy.txt . Se pasan dos argumentos de línea de comando mientras se ejecuta el archivo:

  • la ruta al archivo fuente
  • el archivo de destino