Trabalhando com o sistema de arquivos no Node.js: guia completo
No desenvolvimento web moderno, a capacidade de trabalhar eficientemente com o sistema de arquivos é uma das habilidades-chave de um desenvolvedor backend. O Node.js fornece um módulo fs (File System) poderoso e flexível, que permite realizar todas as operações principais com arquivos e diretórios: leitura, escrita, exclusão, renomeação e muito mais. Neste artigo, vamos detalhar como trabalhar com o sistema de arquivos no Node.js, abordar métodos síncronos e assíncronos, e também estudar o trabalho com caminhos.
Importando o módulo fs e princípios básicos
Para começar a trabalhar com o sistema de arquivos no Node.js, é necessário importar o módulo embutido fs. Isso é feito com uma linha de código:
const fs = require('fs');O módulo fs fornece métodos tanto síncronos quanto assíncronos. Os métodos assíncronos geralmente aceitam uma função de callback como último argumento e são preferíveis para código de produção, pois não bloqueiam o event loop. Os métodos síncronos terminam com Sync e podem ser úteis na inicialização da aplicação ou em scripts.
Além disso, a partir do Node.js 10, está disponível o trabalho com fs/promises — uma versão dos métodos que retornam promises:
const fs = require('fs/promises');Neste artigo, usaremos predominantemente a abordagem assíncrona com promises, pois é a mais moderna e conveniente.
Leitura de arquivos no Node.js
A leitura de arquivos é uma das operações mais comuns. Vamos considerar três maneiras principais.
Leitura do arquivo inteiro (assíncrona)
O método fs.readFile() lê o conteúdo do arquivo completamente para a memória. Isso é conveniente para arquivos pequenos.
const fs = require('fs/promises');
async function readFileExample() { try { const data = await fs.readFile('example.txt', 'utf8'); console.log('Conteúdo do arquivo:', data); } catch (err) { console.error('Erro ao ler o arquivo:', err); }}
readFileExample();Leitura de arquivo linha por linha (leitura em stream)
Para arquivos grandes, é melhor usar streams ou ler o arquivo linha por linha com readline:
const fs = require('fs');const readline = require('readline');
async function readFileLineByLine() { const fileStream = fs.createReadStream('large-file.txt'); const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity });
for await (const line of rl) { console.log('Linha:', line); }}
readFileLineByLine();Leitura síncrona
Se você precisa ler o arquivo imediatamente e está disposto a bloquear a execução:
const fs = require('fs');
try { const data = fs.readFileSync('example.txt', 'utf8'); console.log(data);} catch (err) { console.error(err);}Escrita e atualização de arquivos
O Node.js fornece vários métodos para escrever dados em arquivos.
Escrita em arquivo (sobrescrita)
O método fs.writeFile() cria um novo arquivo ou sobrescreve um existente:
const fs = require('fs/promises');
async function writeFileExample() { try { await fs.writeFile('output.txt', 'Olá, mundo!', 'utf8'); console.log('Arquivo escrito com sucesso'); } catch (err) { console.error('Erro de escrita:', err); }}
writeFileExample();Adicionar dados ao final do arquivo
Se precisar adicionar dados sem excluir os existentes, use fs.appendFile():
const fs = require('fs/promises');
async function appendToFile() { try { await fs.appendFile('log.txt', `Nova entrada: ${new Date()}`); console.log('Dados adicionados'); } catch (err) { console.error('Erro:', err); }