fs.readdir în Node.js

Fișiere și căi (fs, path) Node.js 10.0 (withFileTypes: 10.11, recursive: 20.1)

Listează conținutul unui director: numele fișierelor, opțional cu tipul lor (withFileTypes) și cu subdirectoarele (recursive).

Sintaxă
import { readdir } from "node:fs/promises";
const nume = await readdir(director);
const intrari = await readdir(director, { withFileTypes: true, recursive: true });

Ce face fs.readdir

readdir întoarce numele intrărilor dintr-un director: fișiere, subdirectoare, legături. Nu include . și ... Ordinea nu este garantată (depinde de sistemul de fișiere), așa că sortează lista dacă ai nevoie de o ordine anume.

Cu { withFileTypes: true } primești obiecte Dirent în loc de nume: au proprietatea name, directorul părinte în parentPath și metodele isFile(), isDirectory(), isSymbolicLink(). Așa afli tipul fără câte un stat separat pentru fiecare intrare.

Cu { recursive: true } (Node.js 20.1+) lista include și conținutul subdirectoarelor, cu căi relative de forma src/app.mjs.

Parametri

Parametru Descriere
director Calea directorului de listat.
opțiuni withFileTypes (obiecte Dirent), recursive (și subdirectoarele), encoding (implicit "utf8").

Ce returnează

O promisiune cu un tablou de nume (șiruri) sau, cu withFileTypes, de obiecte Dirent.

Exemple

Exemplul 1: Numele fișierelor, sortate

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

await mkdir("poze");
await writeFile("poze/iasi.jpg", "");
await writeFile("poze/cluj.jpg", "");
await writeFile("poze/brasov.png", "");

const fisiere = await readdir("poze");
fisiere.sort();
console.log(fisiere);

const jpg = fisiere.filter((nume) => nume.endsWith(".jpg"));
console.log("Poze .jpg:", jpg.length);

Rezultat

[ 'brasov.png', 'cluj.jpg', 'iasi.jpg' ]
Poze .jpg: 2

Exemplul 2: Fișiere și directoare: withFileTypes

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

await mkdir("proiect/src", { recursive: true });
await mkdir("proiect/teste");
await writeFile("proiect/package.json", "{}");
await writeFile("proiect/README.md", "# Magazin");

const intrari = await readdir("proiect", { withFileTypes: true });
intrari.sort((a, b) => a.name.localeCompare(b.name));

for (const intrare of intrari) {
  const tip = intrare.isDirectory() ? "director" : "fișier";
  console.log(`${tip.padEnd(8)} ${intrare.name}`);
}

Rezultat

fișier   package.json
fișier   README.md
director src
director teste

Exemplul 3: Tot arborele: recursive

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

await mkdir("site/pagini/blog", { recursive: true });
await writeFile("site/index.html", "");
await writeFile("site/pagini/contact.html", "");
await writeFile("site/pagini/blog/primul-articol.html", "");

const toate = await readdir("site", { recursive: true });
console.log(toate.sort());

Rezultat

[
  'index.html',
  'pagini',
  'pagini/blog',
  'pagini/blog/primul-articol.html',
  'pagini/contact.html'
]

Greșeli frecvente

  • Te bazezi pe ordinea întoarsă de readdir. Pe alt sistem de operare ordinea poate fi alta: sortează explicit.
  • Folosești numele primite direct ca o cale: readdir("poze") întoarce "iasi.jpg", nu "poze/iasi.jpg". Construiește calea cu path.join("poze", nume).
  • Citești un director care conține fișiere ascunse (.DS_Store, .git) și uiți să le filtrezi.

Comenzi înrudite

  • fs.glob: Găsește fișierele care se potrivesc cu un tipar, de exemplu „**/*.js” sau „poze/*.{jpg,png}”.
  • 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.
  • 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).
  • path.join: Lipește mai multe bucăți într-o singură cale, cu separatorul corect pentru sistemul de operare, și curăță ./ și ../.