Introdução ao trabalho com o sistema de arquivos em TypeScript
TypeScript é uma extensão estritamente tipada do JavaScript que adiciona tipagem estática e melhora a legibilidade e a manutenibilidade do código. Uma das tarefas principais no desenvolvimento de aplicações server-side é o trabalho com o sistema de arquivos: leitura e escrita de arquivos, criação e exclusão de diretórios, gerenciamento de fluxos de dados. Neste artigo, vamos detalhar como trabalhar eficientemente com o sistema de arquivos em TypeScript, usando o módulo nativo fs do Node.js.
O módulo fs fornece métodos síncronos e assíncronos para interagir com o sistema de arquivos. Em TypeScript, podemos aproveitar as vantagens da tipagem para tornar o código mais robusto e compreensível. Abordaremos as operações principais, incluindo leitura, escrita, verificação de existência de arquivos, trabalho com diretórios e tratamento de erros.
Operações básicas com arquivos
Leitura de arquivos
Para ler o conteúdo de um arquivo em TypeScript, pode-se usar o método readFile (assíncrono) ou readFileSync (síncrono). A abordagem assíncrona é recomendada para uma execução não bloqueante do programa.
import { readFile } from 'fs/promises';
async function readFileExample(filePath: string): Promise<string> { try { const data = await readFile(filePath, 'utf-8'); return data; } catch (error) { console.error('Erro ao ler o arquivo:', error); throw error; }}
// UsoreadFileExample('example.txt').then(content => { console.log('Conteúdo do arquivo:', content);});Observe o uso de fs/promises — um wrapper baseado em Promises que permite usar a sintaxe async/await. O tipo de retorno Promise<string> indica explicitamente que a função retorna uma string.
Escrita em arquivos
A escrita de dados em um arquivo é feita pelos métodos writeFile e writeFileSync. Em TypeScript, é importante tratar corretamente os possíveis erros, especialmente se o arquivo estiver protegido contra escrita ou o caminho não existir.
import { writeFile, mkdir } from 'fs/promises';import { existsSync } from 'fs';
async function writeFileExample(filePath: string, data: string): Promise<void> { try { // Verifica se o diretório existe const dir = filePath.substring(0, filePath.lastIndexOf('/')); if (dir && !existsSync(dir)) { await mkdir(dir, { recursive: true }); } await writeFile(filePath, data, 'utf-8'); console.log('Arquivo escrito com sucesso'); } catch (error) { console.error('Erro ao escrever o arquivo:', error); }}
// UsowriteFileExample('data/output.txt', 'Hello, TypeScript!');Neste exemplo, primeiro verificamos a existência do diretório e o criamos se necessário usando mkdir com a opção recursive: true. Isso evita o erro "ENOENT" se a pasta pai não existir.
Adicionar dados ao final do arquivo
Se precisar adicionar dados a um arquivo existente, use o método appendFile:
import { appendFile } from 'fs/promises';
async function appendToFile(filePath: string, data: string): Promise<void> { try { await appendFile(filePath, '' + data, 'utf-8'); console.log('Dados adicionados'); } catch (error) { console.error('Erro ao adicionar:', error); }}Trabalho com diretórios
Criação e exclusão de diretórios
Para criar diretórios, usa-se mkdir; para excluir, rmdir ou rm (para exclusão recursiva). Em TypeScript, é conveniente usar genéricos para tipar os caminhos.
import { mkdir, rmdir, rm } from 'fs/promises';import { existsSync } from 'fs';
async function createDirectory(di
```