Ce face fs.stat / fs.access / existsSync
stat întoarce un obiect Stats cu detaliile unui fișier sau director: size (mărimea în octeți), mtime (data ultimei modificări), birthtime (data creării, unde sistemul o oferă) și metodele isFile(), isDirectory(), isSymbolicLink(). lstat face la fel, dar pentru o legătură simbolică descrie legătura, nu fișierul spre care arată.
access(cale, mod) verifică dacă procesul are drepturile cerute: constants.F_OK (există), R_OK (citire), W_OK (scriere), X_OK (execuție). Se rezolvă fără valoare dacă accesul este permis și e respinsă cu o eroare (ENOENT, EACCES) dacă nu.
Pentru o verificare rapidă, existsSync(cale) din node:fs întoarce true sau false. Varianta asincronă fs.exists este învechită și nu are echivalent în fs/promises.
Parametri
| Parametru | Descriere |
|---|---|
cale |
Fișierul sau directorul verificat. |
mod |
Pentru access: constants.F_OK (implicit), R_OK, W_OK, X_OK, combinate cu |. |
opțiuni |
Pentru stat: bigint: true (numere BigInt), throwIfNoEntry: false (Node.js 25.7+, întoarce undefined în loc de eroare). |
Ce returnează
stat / lstat: un obiect Stats. access: undefined sau eroare. existsSync: true sau false.
Exemple
Exemplul 1: Tip și mărime
size numără octeți, nu caractere: literele cu diacritice ocupă câte doi octeți în UTF-8.
import { writeFile, mkdir, stat } from "node:fs/promises";
await writeFile("oras.txt", "Iași");
await mkdir("documente");
for (const cale of ["oras.txt", "documente"]) {
const info = await stat(cale);
console.log(cale, "| fișier:", info.isFile(), "| director:", info.isDirectory());
}
const info = await stat("oras.txt");
console.log("Mărime:", info.size, "octeți");
console.log("Data modificării este un Date:", info.mtime instanceof Date);
Rezultat
oras.txt | fișier: true | director: false
documente | fișier: false | director: true
Mărime: 5 octeți
Data modificării este un Date: true
Exemplul 2: Există? Se poate citi? access și existsSync
import { writeFile, access, constants } from "node:fs/promises";
import { existsSync } from "node:fs";
await writeFile("note.csv", "Ana,9\n");
console.log("note.csv există:", existsSync("note.csv"));
console.log("lipsa.csv există:", existsSync("lipsa.csv"));
async function poateCiti(cale) {
try {
await access(cale, constants.R_OK);
return true;
} catch (eroare) {
console.log(` ${cale}: ${eroare.code}`);
return false;
}
}
console.log("pot citi note.csv:", await poateCiti("note.csv"));
console.log("pot citi lipsa.csv:", await poateCiti("lipsa.csv"));
Rezultat
note.csv există: true
lipsa.csv există: false
pot citi note.csv: true
lipsa.csv: ENOENT
pot citi lipsa.csv: false
Exemplul 3: Mărimea totală a unui director
import { mkdir, writeFile, readdir, stat } from "node:fs/promises";
import path from "node:path";
await mkdir("facturi");
await writeFile("facturi/f1.txt", "Total: 120 lei");
await writeFile("facturi/f2.txt", "Total: 89 lei");
await writeFile("facturi/f3.txt", "Total: 1.250 lei");
let total = 0;
for (const nume of await readdir("facturi")) {
const info = await stat(path.join("facturi", nume));
if (info.isFile()) total += info.size;
}
console.log(`Directorul facturi ocupă ${total} octeți`);
Rezultat
Directorul facturi ocupă 43 octeți
Greșeli frecvente
- Verifici cu
existsSyncși abia apoi deschizi fișierul: între cele două operații fișierul poate fi șters de alt proces. Când urmează să-l folosești oricum, încearcă direct operația și tratează eroareaENOENT. - Confunzi
sizecu numărul de caractere. Pentru text cu diacritice, numărul de octeți este mai mare. - Folosești
statpe o legătură simbolică și te miri că pare fișier obișnuit:staturmează legătura. Pentru legătura însăși foloseștelstat.
Comenzi înrudite
fs.readdir: Listează conținutul unui director: numele fișierelor, opțional cu tipul lor (withFileTypes) și cu subdirectoarele (recursive).fs.readFile: Citește tot conținutul unui fișier: ca text dacă dai codificarea („utf8”), altfel ca Buffer cu octeții bruți.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.glob: Găsește fișierele care se potrivesc cu un tipar, de exemplu „**/*.js” sau „poze/*.{jpg,png}”.