fs e fs/promises
node:fs e node:fs/promises leem, escrevem e transmitem arquivos em disco - APIs de promessa para trabalho assíncrono, streams para escala e flags explícitas para leituras e escritas sensíveis à segurança.
Busque em todas as páginas da documentação
node:fs e node:fs/promises leem, escrevem e transmitem arquivos em disco - APIs de promessa para trabalho assíncrono, streams para escala e flags explícitas para leituras e escritas sensíveis à segurança.
import { readFile, writeFile, mkdir } from 'node:fs/promises';
import { createReadStream } from 'node:fs';
await mkdir('data', { recursive: true });
await writeFile('data/out.json', JSON.stringify({ ok: true }));
const text = await readFile('data/out.json', 'utf8');Quando usar:
import { open, writeFile, rename } from 'node:fs/promises';
import { createReadStream } from 'node:fs';
import { pipeline } from 'node:stream/promises';
import { createGzip } from 'node:zlib';
import { createWriteStream } from 'node:fs';
async function atomicWrite(path: string, data: string): Promise<void> {
const tmp = `${path}.tmp`;
await writeFile(tmp, data, { encoding: 'utf8', mode: 0o600 });
await rename(tmp, path);
}
async function tailBytes(path: string, max: number): Promise<Buffer> {
const handle = await open(path, 'r');
try {
const stat = await handle.stat();
const size = stat.size;
const start = Math.max(0, size - max);
const len = size - start;
const buf = Buffer.alloc(len);
await handle.read(buf, 0, len, start);
return buf;
} finally {
await handle.close();
}
}
await pipeline(createReadStream('large.log'), createGzip(), createWriteStream('large.log.gz'));O que isso demonstra:
rename reduz corrupção de escrita parcialfilehandle.read lê o segmento final sem carregar o arquivo inteiropipeline + createReadStream comprime logs grandes com memória limitada0o600 para configuração sensível no Unixopen/filehandle para leituras/escritas posicionadas.'r', 'w', 'a', 'wx' (criação exclusiva) - previne sobrescrita acidental.fs.watch / fs.promises.watch - use debounce em ferramentas de desenvolvimento; prefira sinais explícitos de recarregamento em produção.| Cenário | API |
|---|---|
| Configuração pequena | readFile |
| Download grande | createReadStream |
| Configuração atômica | escrever temporário + renomear |
| Garantir diretório | mkdir({ recursive: true }) |
import { access, constants } from 'node:fs/promises';
await access('/path/to/file', constants.R_OK);fs/promises ou streams.../../etc/passwd. Correção: resolva sob um diretório base.try/finally com close().| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| SDK S3 | Armazenamento de objetos durável | Arranjos temporários locais OK |
fs-extra npm | Auxiliares de cópia recursiva | mkdir recursivo integrado suficiente |
| BLOB de Banco de Dados | Artefatos consultáveis | Grandes ativos estáticos |
| memfs (testes) | Testes unitários sem disco | Produção |
Use node:fs/promises - prometa o legado apenas em projetos existentes.
Arquivo maior que o orçamento de memória ou sendo canalizado para HTTP/gzip - sempre use streams para escala de uploads/downloads.
Escrita exclusiva - falha se o arquivo existir - útil para arquivos de bloqueio.
Atômico no mesmo sistema de arquivos em POSIX - use para trocas de configuração; renomear entre dispositivos pode precisar de cópia + exclusão.
Corrida entre stat e open - use open com padrões O_NOFOLLOW para código sensível à segurança.
Erros de permissão - execute o contêiner como não-root com montagens de volume corretas.
import { tmpdir } from 'node:os' - limpe arquivos temporários no bloco finally.
Node 20+ readdir com recursive: true - atenção ao tamanho do resultado em árvores grandes.
fs.copyFile para cópias simples - use streams para transformar enquanto copia.
Certifique-se de que UID GID corresponda ao usuário node para permissões de escrita.
O módulo path lida com isso - evite barras invertidas codificadas.
Fundamentos de Streams para padrões de pipeline.
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026