Trabalhando com Arquivos em Node.js
Para trabalhar com arquivos no Node.js, utilizamos o módulo é necessário instalar o fs. Vamos ver como utilizá-lo.
Leitura de Arquivos
Para a leitura assíncrona de arquivos, usamos a função fs.readFile:
fs.readFile(path[, options], callback)A função aceita até três parâmetros:
- path: caminho para o arquivo
- options: parâmetro opcional que representa configurações adicionais de leitura, como a codificação
- callback: função de callback que é executada após a leitura ser concluída O callback possui a seguinte estrutura:- callback(error, data);- O primeiro parâmetro contém informações sobre o erro (se houver) e o segundo contém os dados lidos. 
Suponha que na pasta do projeto exista um arquivo de texto hello.txt com o seguinte conteúdo:
Hello Programício!
Hello World!Para ler o arquivo hello.txt, criamos um arquivo app.js na pasta do projeto com o seguinte código:
const fs = require("fs");
fs.readFile("hello.txt", function (error, data) {
  if (error) {
    // se ocorrer um erro
    return console.log(error);
  }
  console.log(data.toString()); // exibe os dados lidos
});
console.log("Leitura assíncrona de arquivos");Apesar da função fs.readFile() ser chamada primeiro, como ela é assíncrona, não bloqueia o fluxo de execução. Portanto, seu resultado é exibido no final.
c:\app> node app.js Leitura assíncrona de arquivos Hello Programício! Hello World!
Para a leitura síncrona do arquivo, usamos a função fs.readFileSync():
fs.readFileSync(path[, options])O método recebe o caminho do arquivo e, opcionalmente, a codificação. A função retorna os dados lidos.
Exemplo de uso:
const fs = require("fs");
const data = fs.readFileSync("hello.txt");
console.log(data.toString()); // exibe os dados lidos
console.log("Leitura síncrona de arquivos");Saída do console:
c:\app> node app.js Hello Programício! Hello World! Leitura síncrona de arquivos
Escrita de Arquivos
Para a escrita assíncrona de arquivos, utilizamos a função fs.writeFile(), que aceita quatro parâmetros:
fs.writeFile(file, data[, options], callback)Os parâmetros da função são:
- file: caminho para o arquivo
- data: dados a serem gravados
- options: objeto de configuração opcional com as seguintes propriedades:- encoding: codificação usada na escrita (padrão: "utf8")
- mode: modo de gravação como número (padrão: 0o666)
- flag: um dos flags do sistema para abertura do arquivo (padrão:- wpara gravação)
- flush: booleano que indica se os dados devem ser gravados imediatamente (padrão: false)
- signal: objeto- AbortSignalque permite cancelar a gravação
 
- callback: função chamada após a gravação. Se houver um erro, o primeiro parâmetro da função conterá informações sobre o erro.
Exemplo de gravação de arquivo:
const fs = require("fs");
const data = "Hello Node.js\n";
fs.writeFile("hello2.txt", data, function (error) {
  if (error) {
    // se ocorrer um erro
    return console.log(error);
  }
  console.log("Arquivo gravado com sucesso");
});Para a escrita síncrona, usamos a função fs.writeFileSync(), que aceita o caminho do arquivo e os dados a serem gravados:
fs.writeFileSync("hello2.txt", "Hello Work...\n");Esses métodos sobrescrevem o arquivo por padrão. Para adicionar dados ao arquivo, usamos fs.appendFile() e fs.appendFileSync(), que aceitam os mesmos parâmetros:
const fs = require("fs");
// adição síncrona
fs.appendFileSync("hello2.txt", "Hello world\n");
// adição assíncrona
fs.appendFile("hello2.txt", "Hello walk\n", function (error) {
  if (error) return console.log(error); // se ocorrer um erro
  console.log("Gravação concluída");
});Como alternativa, podemos configurar o flag de adição no objeto de configuração com o flag a:
fs.writeFile("hello2.txt", "Hello all\n", { flag: "a" }, function (error) {
  if (error) return console.log(error); // se ocorrer um erro
  console.log("Gravação concluída");
});Obtendo Informações sobre Arquivos
Para obter informações sobre um arquivo de forma assíncrona, usamos a função stat():
fs.stat(path[, options], callback)O primeiro parâmetro representa o caminho do arquivo. O segundo, opcional, é um objeto onde a propriedade bigint armazena um valor booleano indicando se os dados devem ser retornados como números (quando true). O terceiro parâmetro é uma função de callback que aceita dois parâmetros:
callback(error, stats);O primeiro parâmetro contém informações sobre o erro (se houver), e o segundo contém as estatísticas do arquivo. Por exemplo, para obter a estatística de um arquivo:
const fs = require("fs");
fs.stat("hello.txt", (error, stats) => {
  if (error) return console.error(error);
  console.log(stats.isFile()); // true
  console.log(stats.isDirectory()); // false
  console.log(stats);
});A estatística obtida é um objeto com várias propriedades, conforme mostrado abaixo:
c:\app> node app.js
true
false
Stats {
  dev: 16777220,
  mode: 33188,
  nlink: 1,
  uid: 501,
  gid: 20,
  rdev: 0,
  blksize: 4096,
  ino: 8648323536,
  size: 31,
  blocks: 8,
  atimeMs: 1700671481153.5369,
  mtimeMs: 1700667050455.9146,
  ctimeMs: 1700667050455.9146,
  birthtimeMs: 1643908248703.2,
  atime: 2023-11-22T16:44:41.154Z,
  mtime: 2023-11-22T15:30:50.456Z,
  ctime: 2023-11-22T15:30:50.456Z,
  birthtime: 2022-02-03T17:10:48.703Z
}Para obter as estatísticas de um arquivo de forma síncrona, usamos o método statSync(), que recebe o caminho do arquivo e retorna um objeto com as estatísticas:
const fs = require("fs");
const stats = fs.statSync("hello2.txt");
console.log(stats.isFile()); // true
console.log(stats.isDirectory()); // false
console.log(stats);Removendo Arquivos
Para remover um arquivo de forma síncrona, usamos a função fs.unlinkSync(), que recebe o caminho do arquivo a ser removido:
fs.unlinkSync("hello.txt");Também podemos usar a função assíncrona fs.unlink(), que recebe o caminho do arquivo e uma função de callback executada após a remoção:
fs.unlink("hello.txt", (error) => {
  if (error) return console.log(error); // se ocorrer um erro
  console.log("Arquivo deletado");
});Trabalhando com Diretórios
Para criar diretórios, usamos as funções mkdir() (assíncrona) e mkdirSync() (síncrona). Elas recebem o nome do diretório. O método assíncrono aceita uma função de callback executada após a criação do diretório:
const fs = require("fs");
fs.mkdir("test", (error) => {
  if (error) return console.log(error);
  console.log("Diretório criado");
});Para remover um diretório, usamos as funções rmdir() (assíncrona) e rmdirSync() (síncrona). Elas recebem o nome do diretório. O método assíncrono aceita uma função de callback executada após a remoção do diretório:
const fs = require("fs");
fs.rmdir("test", (error) => {
  if (error) return console.log(error);
  console.log("Diretório deletado");
});