Trabalhando com descritores de arquivo no Node.js
Antes de poder interagir com um arquivo que está no seu sistema de arquivos, você deve obter um descritor de arquivo. Um descritor de arquivo é uma referência a um arquivo aberto, um número (fd) retornado ao abrir o arquivo usando o método open()
oferecido pelo módulo fs
. Este número (fd) identifica exclusivamente um arquivo aberto no sistema operacional.
Abrindo arquivos
CommonJS (CJS)
const fs = require('node:fs')
fs.open('/Users/joe/test.txt', 'r', (err, fd) => {
// fd é nosso descritor de arquivo
})
Observe o 'r'
que usamos como segundo parâmetro na chamada fs.open()
. Essa flag significa que abrimos o arquivo para leitura. Outras flags que você usará comumente são:
Flag | Descrição |
---|---|
'w+' | Esta flag abre o arquivo para leitura e escrita. Ele posiciona o fluxo no início do arquivo. |
'a+' | Esta flag abre o arquivo para leitura e escrita e também posiciona o fluxo no final do arquivo. |
Você também pode abrir o arquivo usando o método fs.openSync
, que retorna o descritor de arquivo em vez de fornecê-lo em um callback:
const fs = require('node:fs')
try {
const fd = fs.openSync('/Users/joe/test.txt', 'r')
} catch (err) {
console.error(err)
}
Realizando operações
Depois de obter o descritor de arquivo da maneira que você escolher, você pode realizar todas as operações que o exigem, como chamar fs.close()
e muitas outras operações que interagem com o sistema de arquivos.
Usando fsPromises
Você também pode abrir o arquivo usando o método fsPromises.open
baseado em promises oferecido pelo módulo fs/promises
. O módulo fs/promises
está disponível somente a partir do Node.js v14. Antes do v14, depois do v10, você pode usar require('fs').promises
em vez disso. Antes do v10, depois do v8, você pode usar util.promisify
para converter métodos fs
em métodos baseados em promises.
ES Modules (MJS)
import fs from 'node:fs/promises'
async function run() {
const fileHandle = await fs.open('example.txt', 'r')
try {
filehandle = await fs.open('/Users/joe/test.txt', 'r')
console.log(filehandle.fd)
console.log(await filehandle.readFile({ encoding: 'utf8' }))
} finally {
await fileHandle.close()
}
}
run().catch(console.error)
Exemplo de util.promisify
Aqui está um exemplo de uso de util.promisify
para converter fs.open
em uma função baseada em promessa:
const fs = require('node:fs')
const util = require('node:util')
const open = util.promisify(fs.open)
open('test.txt', 'r')
.then(fd => {
// Usar descritor de arquivo
})
.catch(err => {
// Lidar com erro
})
Para ver mais detalhes sobre o módulo fs/promises
, por favor, consulte a documentação da API fs/promises.