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 arquivooptions
: parâmetro opcional que representa configurações adicionais de leitura, como a codificaçãocallback
: 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 arquivodata
: dados a serem gravadosoptions
: 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:w
para gravação)flush
: booleano que indica se os dados devem ser gravados imediatamente (padrão: false)signal
: objetoAbortSignal
que 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");
});