fs.rename / fs.copyFile / fs.cp în Node.js

Fișiere și căi (fs, path) Node.js 10.0 (rename, copyFile); cp din 16.7, stabil din 22.3

Mută sau redenumește un fișier (rename), copiază un fișier (copyFile) ori un director întreg (cp cu recursive).

Sintaxă
import { rename, copyFile, cp, constants } from "node:fs/promises";
await rename(vechi, nou);
await copyFile(sursa, destinatie[, constants.COPYFILE_EXCL]);
await cp(sursa, destinatie, { recursive: true });

Ce face fs.rename / fs.copyFile / fs.cp

rename schimbă numele sau locul unui fișier ori director. Dacă destinația este un fișier care există, îl înlocuiește. Funcționează doar pe aceeași partiție; între discuri diferite primești EXDEV și trebuie să copiezi, apoi să ștergi.

copyFile copiază un fișier. Implicit suprascrie destinația; cu modul constants.COPYFILE_EXCL eșuează cu EEXIST dacă destinația există deja.

cp copiază și directoare întregi când dai { recursive: true }. Are opțiuni utile: force (suprascrie, implicit true), errorOnExist, filter (o funcție care decide ce se copiază). A fost experimentală până în Node.js 22.3; acum este stabilă.

Parametri

Parametru Descriere
vechi, nou Pentru rename: calea actuală și calea nouă.
sursa, destinatie Pentru copyFile și cp: ce copiezi și unde.
mod Pentru copyFile: constants.COPYFILE_EXCL (nu suprascrie), COPYFILE_FICLONE (copie rapidă copy-on-write, dacă sistemul o permite).
opțiuni cp recursive, force, errorOnExist, filter(sursa, destinatie), preserveTimestamps.

Ce returnează

O promisiune care se rezolvă cu undefined.

Exemple

Exemplul 1: Redenumire și mutare

import { writeFile, mkdir, rename, readdir } from "node:fs/promises";

await writeFile("poza1.jpg", "");
await mkdir("vacanta-iasi");

await rename("poza1.jpg", "palatul-culturii.jpg");
console.log("După redenumire:", (await readdir(".")).filter((n) => n.endsWith(".jpg")));

await rename("palatul-culturii.jpg", "vacanta-iasi/palatul-culturii.jpg");
console.log("În vacanta-iasi:", await readdir("vacanta-iasi"));

Rezultat

După redenumire: [ 'palatul-culturii.jpg' ]
În vacanta-iasi: [ 'palatul-culturii.jpg' ]

Exemplul 2: Copie de siguranță fără suprascriere

import { writeFile, copyFile, readFile, constants } from "node:fs/promises";

await writeFile("buget.csv", "luna,cheltuieli\noctombrie,2300 lei\n");

await copyFile("buget.csv", "buget.backup.csv", constants.COPYFILE_EXCL);
console.log(await readFile("buget.backup.csv", "utf8"));

try {
  await copyFile("buget.csv", "buget.backup.csv", constants.COPYFILE_EXCL);
} catch (eroare) {
  console.log("A doua copie:", eroare.code);
}

Rezultat

luna,cheltuieli
octombrie,2300 lei

A doua copie: EEXIST

Exemplul 3: Copierea unui director cu filtru

filter primește fiecare cale; aici sunt sărite fișierele .log.

import { mkdir, writeFile, cp, readdir } from "node:fs/promises";

await mkdir("site/css", { recursive: true });
await writeFile("site/index.html", "<h1>Magazin</h1>");
await writeFile("site/css/stil.css", "body { margin: 0 }");
await writeFile("site/erori.log", "eroare veche");

await cp("site", "publicat", {
  recursive: true,
  filter: (sursa) => !sursa.endsWith(".log"),
});

console.log((await readdir("publicat", { recursive: true })).sort());

Rezultat

[ 'css', 'css/stil.css', 'index.html' ]

Greșeli frecvente

  • Folosești rename între discuri sau partiții diferite și primești EXDEV. Copiază cu cp / copyFile, apoi șterge sursa.
  • Uiți că rename și copyFile suprascriu fără întrebare un fișier existent. Pentru copii folosește COPYFILE_EXCL; pentru mutări verifică întâi destinația.
  • Apelezi cp pe un director fără recursive: true: primești o eroare, nu o copie goală.

Comenzi înrudite

  • fs.rm / fs.unlink / fs.rmdir: Șterge fișiere și directoare: rm pentru orice (cu recursive pentru directoare pline), unlink pentru un fișier, rmdir pentru un director gol.
  • fs.writeFile / fs.appendFile: Scrie un fișier (îl creează sau îl suprascrie) ori adaugă text la sfârșitul lui, cu appendFile.
  • fs.mkdir / fs.mkdtemp: Creează un director (cu toți părinții lipsă, prin recursive: true) sau un director temporar cu nume unic (mkdtemp).
  • fs.stat / fs.access / existsSync: Află informații despre un fișier (tip, mărime, date), verifică dacă există și dacă poate fi citit sau scris.