Skip to content

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)

javascript
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:

BanderaDescripció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:

javascript
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)

javascript
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:

javascript
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.