Não há necessidade de instalá-lo, Sendo parte do Node, isso pode ser usado simplesmente requisitando isso:
const fs = require('fs')
Once you do so, you have access to all its methods, which include:
fs.access()
: verifca se o arquivo exist e o Node tem permissão para acessá-lofs.appendFile()
: anexe dados ao arquivo. Se o arquivo não existe, ele será criadofs.chmod()
: muda as permissões de um arquivo especifico passando o nome do arquivo. Palavras-chave:fs.lchmod()
,fs.fchmod()
fs.chown()
: altere o proprietário e o grupo de um arquivo especificado pelo nome do arquivo passado. Palavras-chave:fs.fchown()
,fs.lchown()
fs.close()
: fecha o descritor de um arquivofs.copyFile()
: copie um arquivocreate a readable file streamfs.createWriteStream()
: crie um arquivo stream de escriturafs.link()
: crie um novo link ao arquivofs.mkdir()
: cria uma nova pastafs.mkdtemp()
: cria um diretório temporáriofs.open()
: abre o arquivofs.readdir()
: leia o conteúdo de um diretóriofs.readFile()
: leia o conteúdo de um arquivo. Palavras-chave:fs.read()
fs.readlink()
: leia o valor de um linkfs.realpath()
: transform os caminhos relativos (.
,..
) em caminhos completofs.rename()
: renomeie uma pasta ou um arquivofs.rmdir()
: remova uma pastafs.stat()
: retorna o status de um arquivo especificado pelo nome. Relacionado:fs.fstat()
,fs.lstat()
fs.symlink()
: crie um novo link simbólico para o arquivofs.unlink()
: remove um arquivo ou um link simbólicofs.unwatchFile()
: pare de observar mudançasfs.utimes()
: altere o registro de data e hora do arquivo identificado pelo nome do arquivo passado. Palavras-chave:fs.futimes()
fs.watchFile()
: comece a observar mudanças no arquivo. Palavras-chave:fs.watch()
fs.writeFile()
: grave dados em um arquivo. Palavras-chave:fs.write()
Uma coisa peculiar sobre o módulo fs
é que todos os métodos são assíncronos por padrão, mas eles também podem trabalhar de forma síncrona, basta acrescentar o sync
.
Por exemplo
fs.rename()
fs.renameSync()
fs.write()
fs.writeSync()
Isso faz uma grande diferença no fluxo da sua aplicação.
O Node 10 incluiu um suporte para uma API baseada em promises.
Por example, vamos examinar o método fs.rename()
. A API assíncrona é usada com uma callback:
const fs = require('fs')
fs.rename('before.json', 'after.json', (err) => {
if (err) {
return console.error(err)
}
//terminado
})
Uma API assíncrona pode ser usada assim, com um try/catch
para tratar erros:
const fs = require('fs')
try {
fs.renameSync('before.json', 'after.json')
//terminado
} catch (err) {
console.error(err)
}
A principal diferença aqui é que a execução do seu script será bloqueada no segundo exemplo, até que a operação do arquivo seja bem sucedida.
O módulo path
do Node.js fornece funções úteis para interagir com o path (caminho) dos arquivos.
Não há necessidade de instalá-lo. Sendo parte do Node, ele pode ser usado simplesmente digitando isso:
const path = require('path')
Esse módulo fornece o path.sep
, que disponibiliza o separador de paths ( \
no Windows, e /
no Linux e no macOS), e o path.delimiter
, que disponibiliza o delimitador do path ( ;
no Windows, e :
no Linux e no macOS).
Esses são os métodos do path
:
path.basename()
path.dirname()
path.extname()
path.isAbsolute()
path.join()
path.normalize()
path.parse()
path.relative()
path.resolve()
Retorna a última parte de um caminho. Um segundo parâmetro pode filtrar a extensão do arquivo:
require('path').basename('/test/something') //something
require('path').basename('/test/something.txt') //something.txt
require('path').basename('/test/something.txt', '.txt') //something
Retorna a parte do diretório de um caminho:
require('path').dirname('/test/something') // /test
require('path').dirname('/test/something/file.txt') // /test/something
Retorna a última parte da extensão de um caminho:
require('path').extname('/test/something') // ''
require('path').extname('/test/something/file.txt') // '.txt'
Retorna a última parte da extensão de um caminho:
require('path').extname('/test/something') // ''
require('path').extname('/test/something/file.txt') // '.txt'
Retorna true
se o caminho for absoluto:
require('path').isAbsolute('/test/something') // true
require('path').isAbsolute('./test/something') // false
Junta duas ou mais partes de um caminho
const name = 'flavio'
require('path').join('/', 'users', name, 'notes.txt') //'/users/flavio/notes.txt'
Tenta calcular o caminho atual quando esse contém especificadores relativos como .
ou ..
, ou barras duplas
require('path').normalize('/users/flavio/..//test.txt') ///users/test.txt
Analisa um caminho para um objeto com os segmentos que o compõem:
root
: a raízdir
: o caminho do arquivo a partir da raízbase
: o nome do arquivo + extensãoname
: o nome do arquivoext
: a extensão do arquivo
Exemplo:
require('path').parse('/users/test.txt')
Retorna:
{
root: '/',
dir: '/users',
base: 'test.txt',
ext: '.txt',
name: 'test'
}
Aceita 2 caminhos como argumentos. Retorna o caminho relativo do primeiro ao segundo caminho, com base no diretório de trabalho atual.
Exemplo:
require('path').relative('/Users/flavio', '/Users/flavio/test.txt') //'test.txt'
require('path').relative('/Users/flavio', '/Users/flavio/something/test.txt') //'something
/test.txt'
Você pode calcular o caminho absoluto de um caminho relativo usando o path.resolve()
:
path.resolve('flavio.txt') //'/Users/flavio/flavio.txt' se eu executar do meu arquivo inicial
Ao especificar um segundo pârametro, o resolve
irá usar o primeiro como base para o segundo:
path.resolve('tmp', 'flavio.txt')//'/Users/flavio/tmp/flavio.txt' se eu executar do meu arquivo inicial
Se o primeiro pârametro iniciar com uma barra, isso significa que é um caminho absoluto:
path.resolve('/etc', 'flavio.txt')//'/etc/flavio.txt'
Este módulo fornece muitas funções que você pode usar para recuperar informações do sistema operacional subjacente e o computador em que o programa é executado, e interagir com elas.
const os = require('os')
Existem algumas propriedades úteis que nos dizem algumas coisas importantes relacionadas ao manuseio de arquivos:
os.EOL
fornece a sequência do delimitador de linha. Está \n no Linux e macOS e \r\n no Windows.
There are a few useful properties that tell us some key things related to handling files:
os.EOL gives the line delimiter sequence. It's \n on Linux and macOS, and \r\n on
Windows.
os.constants.signals
nos mostra todas as constantes relacionadas ao tratamento de sinais no processo, como
SIGHUP, SIGKILL e assim por diante.
os.constants.errno
define as constantes para o relatório de erros, como EADDRINUSE, EOVERFLOW
e mais.
Você pode ler todos elas em https://nodejs.org/api/os.html#os_signal_constants.
Vamos agora ver os principais métodos que o os
fornece:
os.arch()
os.cpus()
os.endianness()
os.freemem()
os.homedir()
os.hostname()
os.loadavg()
os.networkInterfaces()
os.platform()
os.release()
os.tmpdir()
os.totalmem()
os.type()
os.uptime()
Retorna a string que identifica a arquitetura subjacente, como arm
, x64
, arm64
.
Retorna informações sobre as CPUs disponíveis no seu sistema.
Exemplo:
[ { model: 'Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz',
speed: 2400,
times:
{ user: 281685380,
nice: 0,
sys: 187986530,
idle: 685833750,
irq: 0 } },
{ model: 'Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz',
speed: 2400,
times:
{ user: 282348700,
nice: 0,
sys: 161800480,
idle: 703509470,
irq: 0 } } ]
Retura BE
ou LE
dependendo se o Node foi compilado com Big Endian
ou Little Endian
.
Retorna o número de bytes que representam a memória livre no sistema.
Retorna o caminho para o diretório inicial do usuário atual.
Exemplo:
'/Users/flavio'
Retorna o nome do host.
Retorna o cálculo de média de carga feito pelo sistema operacional.
Ele retorna apenas um valor significativo no Linux e no macOS.
Exemplo:
[ 3.68798828125, 4.00244140625, 11.1181640625 ]
Retorna os detalhes das interfaces de rede disponíveis no seu sistema.
Exemplo:
{ lo0:
[ { address: '127.0.0.1',
netmask: '255.0.0.0',
family: 'IPv4',
mac: 'fe:82:00:00:00:00',
internal: true },
{ address: '::1',
netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
family: 'IPv6',
mac: 'fe:82:00:00:00:00',
scopeid: 0,
internal: true },
{ address: 'fe80::1',
netmask: 'ffff:ffff:ffff:ffff::',
family: 'IPv6',
mac: 'fe:82:00:00:00:00',
scopeid: 1,
internal: true } ],
en1:
[ { address: 'fe82::9b:8282:d7e6:496e',
netmask: 'ffff:ffff:ffff:ffff::',
family: 'IPv6',
mac: '06:00:00:02:0e:00',
scopeid: 5,
internal: false },
{ address: '192.168.1.38',
netmask: '255.255.255.0',
family: 'IPv4',
mac: '06:00:00:02:0e:00',
The os module
165
internal: false } ],
utun0:
[ { address: 'fe80::2513:72bc:f405:61d0',
netmask: 'ffff:ffff:ffff:ffff::',
family: 'IPv6',
mac: 'fe:80:00:20:00:00',
scopeid: 8,
internal: false } ] }
Retorna a plataforma para a qual o Node foi compilado:
darwin
freebsd
linux
openbsd
win32
- ...mais
Retorna uma string que identifica o número da versão do sistema operacional
Retorna o caminho para a pasta temporária atribuída.
Retorna o número de bytes que representam a memória total disponível no sistema.
Identifica o sistema operacional:
Linux
Darwin
on macOSWindows_NT
no Windows
Retorna o número de segundos que o computador está executando desde a última reinicialização.
O módulo events
do Node.js fornece a classe EventEmitter, que é a chave para trabalhar com eventos no Node.
Eu publiquei um artigo completo sobre isso, então aqui eu irei apenas descrever a API sem examples mais profundos de como usá-la.
const EventEmitter = require('events')
const door = new EventEmitter()
O ouvinte de evento usa estes eventos:
newListener
quando um ouvinte é adicionadoremoveListener
quando ouvinte é removido
Aqui temos uma descrição detalhada dos métodos mais úteis:
emitter.addListener()
emitter.emit()
emitter.eventNames()
emitter.getMaxListeners()
emitter.listenerCount()
emitter.listeners()
emitter.off()
emitter.on()
emitter.once()
emitter.prependListener()
emitter.prependOnceListener()
emitter.removeAllListeners()
emitter.removeListener()
emitter.setMaxListeners()
Pseudônimo para emitter.on()
Emite um evento. Chama de forma síncrona todos os ouvintes de eventos na ordem em que foram registrados
Retorne um array de strings que representam os eventos registrados no EventListener atual:
door.eventNames()
Obtenha a quantidade máxima de ouvintes que você pode adicionar a um objeto EventListener. O padrão
é 10, mas pode ser aumentado ou reduzido usando setMaxListeners()
door.getMaxListeners()
Obtenha a contagem de ouvintes do evento passados como parâmetro:
door.listenerCount('open')
Obtém um array de event listeners passados como parâmetro:
door.listeners('open')
Pseudônimo para o emitter.removeListener()
, adicionado no Node 10
Adiciona uma callback que é chamada quando um evento é acionado.
Use:
door.on('open', () => {
console.log('Door was opened')
})
Adiciona uma callback que é chamada quando um evento é acionado pela primeira vez. Essa callback só será chamada uma vez.
const EventEmitter = require('events')
const ee = new EventEmitter()
ee.once('my-event', () => {
//chama a callback uma vez
})
Quando você adiciona um listener usando on
ou addListener
, ele é adicionado por último na fila de listeners e é o último a ser chamado. Usando prependListener
, ele é adicionado e chamado antes dos outros listeners.
Quando você adiciona um ouvinte usando o once
, ele é adicionado por último na fila de ouvintes e é o último a ser chamado.
Usando prependOnceListener
, ele é adicionado e chamado antes de outros ouvintes.
Remove todos os listeners de um objeto emissor de eventos que está ouvindo um evento específico:
door.removeAllListeners('open')
Remova um listener específico. Você pode fazer isso atribuindo a callback a uma variável, quando adicionado, para que você possa fazer uma referência posteriormente:
const doSomething = () => {}
door.on('open', doSomething)
door.removeListener('open', doSomething)
Define a quantidade máxima de listeners que você pode adicionar a EventListener, cujo padrão é 10, mas pode ser aumentado ou diminuído.
door.setMaxListeners(50)