fs.stat / fs.access / existsSync în Node.js

Fișiere și căi (fs, path) Node.js 10.0 (fs/promises); existsSync din 0.1

Află informații despre un fișier (tip, mărime, date), verifică dacă există și dacă poate fi citit sau scris.

Sintaxă
import { stat, lstat, access, constants } from "node:fs/promises";
const info = await stat(cale);
await access(cale, constants.R_OK);
import { existsSync } from "node:fs";

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ă eroarea ENOENT.
  • Confunzi size cu numărul de caractere. Pentru text cu diacritice, numărul de octeți este mai mare.
  • Folosești stat pe o legătură simbolică și te miri că pare fișier obișnuit: stat urmează legătura. Pentru legătura însăși folosește lstat.

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}”.