Trabajando con descriptores de archivos en Node.js
Antes de poder interactuar con un archivo que reside en su sistema de archivos, debe obtener un descriptor de archivo. Un descriptor de archivo es una referencia a un archivo abierto, un número (fd) devuelto al abrir el archivo usando el método open()
ofrecido por el módulo fs
. Este número (fd) identifica de forma única un archivo abierto en el sistema operativo.
Abriendo Archivos
CommonJS (CJS)
const fs = require('node:fs')
fs.open('/Users/joe/test.txt', 'r', (err, fd) => {
// fd es nuestro descriptor de archivo
})
Observe la 'r'
que usamos como segundo parámetro en la llamada fs.open()
. Esa bandera significa que abrimos el archivo para lectura. Otras banderas que comúnmente usará son:
Bandera | Descripción |
---|---|
'w+' | Esta bandera abre el archivo para lectura y escritura. Posiciona la secuencia al comienzo del archivo. |
'a+' | Esta bandera abre el archivo para lectura y escritura y también posiciona la secuencia al final del archivo. |
También puede abrir el archivo usando el método fs.openSync
, que devuelve el descriptor de archivo en lugar de proporcionarlo en una devolución de llamada:
const fs = require('node:fs')
try {
const fd = fs.openSync('/Users/joe/test.txt', 'r')
} catch (err) {
console.error(err)
}
Realizando Operaciones
Una vez que obtenga el descriptor de archivo de la manera que elija, puede realizar todas las operaciones que lo requieren, como llamar a fs.close()
y muchas otras operaciones que interactúan con el sistema de archivos.
Usando fsPromises
También puede abrir el archivo usando el método fsPromises.open
basado en promesas ofrecido por el módulo fs/promises
. El módulo fs/promises
está disponible solo a partir de Node.js v14. Antes de la v14, después de la v10, puede usar require('fs').promises
en su lugar. Antes de la v10, después de la v8, puede usar util.promisify
para convertir los métodos fs
en métodos basados en promesas.
Módulos ES (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)
Ejemplo de util.promisify
Aquí hay un ejemplo del uso de util.promisify
para convertir fs.open
en una función basada en promesas:
const fs = require('node:fs')
const util = require('node:util')
const open = util.promisify(fs.open)
open('test.txt', 'r')
.then(fd => {
// Usar descriptor de archivo
})
.catch(err => {
// Manejar error
})
Para ver más detalles sobre el módulo fs/promises
, por favor consulte la documentación de la API de fs/promises.