Skip to content

Utilizzo dei descrittori di file in Node.js

Prima di poter interagire con un file presente nel filesystem, è necessario ottenere un descrittore di file. Un descrittore di file è un riferimento a un file aperto, un numero (fd) restituito aprendo il file usando il metodo open() offerto dal modulo fs. Questo numero (fd) identifica in modo univoco un file aperto nel sistema operativo.

Apertura di file

CommonJS (CJS)

javascript
const fs = require('node:fs')
fs.open('/Users/joe/test.txt', 'r', (err, fd) => {
  // fd è il nostro descrittore di file
})

Si noti la 'r' utilizzata come secondo parametro della chiamata fs.open(). Questo flag indica che apriamo il file per la lettura. Altri flag che si utilizzano comunemente sono:

FlagDescrizione
'w+'Questo flag apre il file per la lettura e la scrittura. Posiziona il flusso all'inizio del file.
'a+'Questo flag apre il file per la lettura e la scrittura e posiziona anche il flusso alla fine del file.

È anche possibile aprire il file utilizzando il metodo fs.openSync, che restituisce il descrittore di file invece di fornirlo in una callback:

javascript
const fs = require('node:fs')

try {
  const fd = fs.openSync('/Users/joe/test.txt', 'r')
} catch (err) {
  console.error(err)
}

Esecuzione di operazioni

Una volta ottenuto il descrittore di file nel modo scelto, è possibile eseguire tutte le operazioni che lo richiedono, come chiamare fs.close() e molte altre operazioni che interagiscono con il filesystem.

Utilizzo di fsPromises

È anche possibile aprire il file utilizzando il metodo fsPromises.open basato su promise offerto dal modulo fs/promises. Il modulo fs/promises è disponibile solo da Node.js v14. Prima della v14, dopo la v10, è possibile utilizzare require('fs').promises. Prima della v10, dopo la v8, è possibile utilizzare util.promisify per convertire i metodi fs in metodi basati su promise.

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

Esempio di util.promisify

Ecco un esempio di utilizzo di util.promisify per convertire fs.open in una funzione basata su promise:

javascript
const fs = require('node:fs')
const util = require('node:util')

const open = util.promisify(fs.open)

open('test.txt', 'r')
  .then(fd => {
    // Usa il descrittore del file
  })
  .catch(err => {
    // Gestisci l'errore
  })

Per maggiori dettagli sul modulo fs/promises, si prega di consultare la documentazione dell'API fs/promises.