fs.rm / fs.unlink / fs.rmdir în Node.js

Fișiere și căi (fs, path) Node.js 14.14 (rm); unlink și rmdir din 10.0 (fs/promises)

Șterge fișiere și directoare: rm pentru orice (cu recursive pentru directoare pline), unlink pentru un fișier, rmdir pentru un director gol.

Sintaxă
import { rm, unlink, rmdir } from "node:fs/promises";
await rm(cale, { recursive: true, force: true });
await unlink(fișier);
await rmdir(directorGol);

Ce face fs.rm / fs.unlink / fs.rmdir

rm șterge un fișier sau, cu { recursive: true }, un director cu tot conținutul lui, ca rm -r din terminal. Cu { force: true } nu dă eroare dacă ținta nu există, ca rm -f.

unlink șterge un singur fișier (sau o legătură simbolică) și eșuează pe directoare. rmdir șterge doar un director gol; pentru directoare cu conținut folosește rm cu recursive.

Ștergerea este definitivă: fișierele nu ajung în Coșul de gunoi. Verifică de două ori calea înainte să rulezi rm recursiv, mai ales când o construiești din variabile.

Parametri

Parametru Descriere
cale Fișierul sau directorul de șters.
recursive Opțiune rm: șterge directoare cu tot conținutul. Implicit false.
force Opțiune rm: fără eroare dacă ținta lipsește. Implicit false.
maxRetries, retryDelay Opțiuni rm: câte reîncercări face la erori temporare (EBUSY, EPERM pe Windows) și la ce interval, în milisecunde.

Ce returnează

O promisiune care se rezolvă cu undefined după ștergere.

Exemple

Exemplul 1: Un fișier și un director plin

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

await writeFile("ciorna.txt", "de șters");
await mkdir("cache/imagini", { recursive: true });
await writeFile("cache/imagini/logo.png", "");
await writeFile("pastreaza.txt", "rămâne");
console.log("Înainte:", (await readdir(".")).filter((n) => n !== "exemplu.mjs").sort());

await rm("ciorna.txt");
await rm("cache", { recursive: true });
console.log("După:", (await readdir(".")).filter((n) => n !== "exemplu.mjs").sort());

Rezultat

Înainte: [ 'cache', 'ciorna.txt', 'pastreaza.txt' ]
După: [ 'pastreaza.txt' ]

Exemplul 2: force: fără eroare când ținta lipsește

import { rm } from "node:fs/promises";

try {
  await rm("nu-exista.log");
} catch (eroare) {
  console.log("Fără force:", eroare.code);
}

await rm("nu-exista.log", { force: true });
console.log("Cu force: nicio eroare");

Rezultat

Fără force: ENOENT
Cu force: nicio eroare

Exemplul 3: unlink și rmdir

import { mkdir, writeFile, unlink, rmdir } from "node:fs/promises";

await mkdir("export");
await writeFile("export/raport.csv", "luna,total\n");

try {
  await rmdir("export");
} catch (eroare) {
  console.log("rmdir pe director plin:", eroare.code);
}

await unlink("export/raport.csv");
await rmdir("export");
console.log("Am șters fișierul, apoi directorul gol");

Rezultat

rmdir pe director plin: ENOTEMPTY
Am șters fișierul, apoi directorul gol

Greșeli frecvente

  • Construiești calea din date primite de la utilizator și o dai lui rm recursiv: o valoare goală sau .. poate șterge alt director decât cel dorit. Verifică întâi calea (de exemplu cu path.resolve și o comparație cu directorul permis).
  • Folosești rmdir cu { recursive: true }. Opțiunea este învechită la rmdir; folosește rm(cale, { recursive: true }).
  • Folosești force: true peste tot și nu mai observi că o cale este greșită. Pune force doar acolo unde lipsa fișierului este normală.

Comenzi înrudite

  • 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.rename / fs.copyFile / fs.cp: Mută sau redenumește un fișier (rename), copiază un fișier (copyFile) ori un director întreg (cp cu recursive).
  • 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.
  • path.resolve / path.relative: Transformă o cale în cale absolută (resolve), calculează drumul dintre două căi (relative) și verifică sau curăță căi.