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știEXDEV. Copiază cucp/copyFile, apoi șterge sursa. - Uiți că
renameșicopyFilesuprascriu fără întrebare un fișier existent. Pentru copii foloseșteCOPYFILE_EXCL; pentru mutări verifică întâi destinația. - Apelezi
cppe 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.