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)
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:
Flag | Descrizione |
---|---|
'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:
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)
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:
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.