fs::rename în Rust

Redenumește sau mută un fișier ori un director; destinația existentă este înlocuită.

Sintaxă
pub fn rename<P: AsRef<Path>, Q: AsRef<Path>>(from: P, to: Q) -> io::Result<()>

Ce face fs::rename

fs::rename(vechi, nou) schimbă numele sau locul unui fișier (sau director) în același sistem de fișiere. Operația este rapidă, pentru că nu copiază datele. Dacă destinația este un fișier existent, este înlocuită.

Între discuri sau partiții diferite, rename dă eroare (pe Linux CrossesDevices). În acest caz copiezi cu fs::copy și ștergi originalul.

Parametri

Parametru Descriere
from Calea actuală.
to Noua cale.

Ce returnează

io::Result<()>.

Exemple

Exemplul 1: Redenumire și mutare într-un director

use std::fs;
use std::path::Path;

fn main() -> std::io::Result<()> {
    fs::write("ciorna.txt", "Articol despre Rust")?;
    fs::rename("ciorna.txt", "articol.txt")?;
    println!("ciorna.txt există: {}", Path::new("ciorna.txt").exists());

    fs::create_dir_all("publicate")?;
    fs::rename("articol.txt", "publicate/rust.txt")?;
    println!("conținut mutat: {}", fs::read_to_string("publicate/rust.txt")?);
    Ok(())
}

Rezultat

ciorna.txt există: false
conținut mutat: Articol despre Rust

Exemplul 2: Salvare sigură: scrii într-un fișier temporar, apoi îl redenumești

Dacă programul se oprește în timpul scrierii, fișierul original rămâne întreg. Redenumirea înlocuiește fișierul vechi dintr-un singur pas.

use std::fs;

fn salveaza(cale: &str, continut: &str) -> std::io::Result<()> {
    let temporar = format!("{cale}.tmp");
    fs::write(&temporar, continut)?;
    fs::rename(&temporar, cale)
}

fn main() -> std::io::Result<()> {
    salveaza("scoruri.txt", "Ana 120\n")?;
    salveaza("scoruri.txt", "Ana 150\nDan 90\n")?;
    print!("{}", fs::read_to_string("scoruri.txt")?);
    println!("rămas .tmp: {}", fs::metadata("scoruri.txt.tmp").is_ok());
    Ok(())
}

Rezultat

Ana 150
Dan 90
rămas .tmp: false

Greșeli frecvente

  • Folosești rename pentru a muta pe alt disc: dă eroare. Copiază și șterge.
  • Te aștepți ca rename să refuze o destinație existentă: o înlocuiește fără avertisment.

Comenzi înrudite

  • fs::copy: Copiază conținutul unui fișier în altul (îl creează sau îl suprascrie) și returnează numărul de octeți copiați.
  • fs::remove_file: remove_file șterge un fișier; remove_dir_all șterge un director cu tot conținutul lui. Ștergerea este definitivă.
  • fs::write: Scrie tot conținutul dat într-un fișier, creându-l dacă nu există și înlocuindu-l dacă există.