Dans ce premier chapitre consacré à NodeJS nous allons voir comment lire et écrire des fichiers.
Support de import EcmaScript
Par défaut, les version actuelles de NodeJS n'utilisent pas par défaut le système d'import d'EcmaScript et ne comprendront pas la syntaxe avec import
. Pour forcer ce support vous avez 2 possibilités.
- Changer l'extension de vos fichier pour utiliser
.mjs
- Ajouter une propriété
"type": "module"
dans votrepackage.json
(vous pouvez générer ce fichier à l'aide de la commandenpm init
)
Les modules NodeJS
Pour importer les modules propre à NodeJS on utilisera le nom du module préfixé par node:
.
import fs from 'node:fs'
const content = fs.readFileSync('demo.txt')
On aura aussi la possibilité de n'importer que la méthodes qui nous intérèsse.
import { readFileSync } from 'node:fs'
const content = readFileSync('demo.txt')
Synchrone ou Asynchrone
La plupart des méthodes liées aux fichiers disposent de 3 versions
fs.<nom>Sync
permet de faire une opération de manière synchrone (en bloquant votre script)fs.<nom>
permet de faire une opération de manière asynchrone en utilisant un callback en paramètre.fsPromises.<nom>
permet de faire une opération de manière asynchrone en renvoyant une promesse.
En général, on aura tendance à utiliser la version avec les promesses vu qu'elle offre la forme la plus moderne. Par exemple pour lire un fichier on utilisera la méthode de cette manière.
import { readFile } from 'node:fs/promises';
try {
const content = await readFile(fileName, { encoding: 'utf8 });
} catch (err) {
console.error("Impossible de lire le fichier " + err);
}
Méthodes utiles
Pour découvrir les différentes méthodes vous pouvez parcourir la documentation sur le système de fichier mais je vous propose une sélection des méthodes les plus utiles.
- readFile permet de lire un fichier (utiliser l'option
encoding
pour obtenir une chaîne de caractère). - writeFile permet d'écrire dans un fichier (utiliser l'option
flag
en fonction de ce que vous voulez faire). - copyFile
- rename
- rm permet de supprimer un fichier.
- readdir permet de lire le contenu d'un dossier
- stat permet d'obtenir des informations sur un fichier (taille, date de création, date de modification...)
Attention au chemin
Attention, si les chemins que vous passez à ces différentes méthodes sont relatif ils seront résolus par rapport au dossier dans lequel vous éxécutez le script NodeJS (et non pas relativement au fichier JavaScript dans lequel se trouve le code). Si vous voulez récupérer le chemin du fichier courant vous pouvez utiliser import.meta.url
import { fileURLToPath } from 'node:url'
import { dirname, join } from 'node:path'
const directory = dirname(fileURLToPath(import.meta.url))
const content = readFile(join(directory, 'demo.txt'))
console.log(content)
Lecture et écriture plus fine
Pour des opération plus fine sur les fichier il est possible d'utiliser les méthode write
et read
qu'il faudra utiliser sur un fichier préalablement ouvert.
import {open} from 'node:fs/promises'
const fileHandle = await open('hello.txt', 'a+')
try {
fileHandle.write('Bonjour')
const firstLetters = await fileHandle.read({position: 4, length: 3})
console.log(firstLetters.buffer.toString('utf8')) // our
} finally {
fileHandle.close() // On ferme le fichier quand on a finit de travailler
}