Lavorare con i descrittori di file in Node.js
Prima di poter interagire con un file nel tuo filesystem, devi ottenere un descrittore di file.
Un descrittore di file è un riferimento a un file aperto, un numero (fd
) restituito aprendo il file utilizzando il metodo open()
offerto dal modulo fs
. Questo numero (fd
) identifica in modo univoco un file aperto nel sistema operativo:
const fs = require("node:fs");
fs.open("/Users/joe/test.txt", "r", (err, fd) => { // fd è il nostro descrittore di file});
Nota la r
che abbiamo utilizzato come secondo parametro nella chiamata fs.open()
.
Quel flag significa che apriamo il file per la lettura.
Altre flag che userai comunemente sono:
Bandiera | Descrizione | File Creato se Non Esiste |
---|---|---|
r+ | Questa bandiera apre il file per la lettura e la scrittura. | ❌ |
w+ | Questa bandiera apre il file per la lettura e la scrittura e posiziona anche il flusso all’inizio del file. | ✅ |
a | Questa bandiera apre il file per la scrittura e posiziona anche il flusso alla fine del file. | ✅ |
a+ | Questa bandiera apre il file per la lettura e la scrittura e posiziona anche il flusso alla fine del file. | ✅ |
Puoi anche aprire il file usando il metodo fs.openSync
, che restituisce il descrittore di file, anziché fornirlo in un callback:
const fs = require("node:fs");
try { const fd = fs.openSync("/Users/joe/test.txt", "r");} catch (err) { console.error(err);}
Una volta ottenuto il descrittore di file, in qualsiasi modo tu scelga, puoi eseguire tutte le operazioni che lo richiedono, come chiamare fs.close()
e molte altre operazioni che interagiscono con il filesystem.
Puoi anche aprire il file utilizzando il metodo fsPromises.open
basato su promesse offerto dal modulo fs/promises
.
Il modulo fs/promises
è disponibile solo a partire da Node.js v14. Prima della versione 14, dopo la versione 10, puoi utilizzare require('fs').promises
al suo posto. Prima della versione 10, dopo la versione 8, puoi utilizzare util.promisify
per convertire i metodi di fs
in metodi basati su promesse.
const fs = require("node:fs/promises");// O const fs = require('fs').promises prima della v14.async function esempio() { let filehandle; try { filehandle = await fs.open("/Users/joe/test.txt", "r"); console.log(filehandle.fd); console.log(await filehandle.readFile({ encoding: "utf8" })); } finally { if (filehandle) await filehandle.close(); }}esempio();
Ecco un esempio di util.promisify
:
const fs = require("node:fs");const util = require("node:util");
async function esempio() { const open = util.promisify(fs.open); const fd = await open("/Users/joe/test.txt", "r");}esempio();