const fs = require('fs');
const filename="binary.bin";
fs.readFile(filename, (err, data) => {
if (err) {
console.error('Error reading file:', err);
return;
}
console.log(data);
// process the Buffer data using Buffer methods (e.g., slice, copy)
});
Diffusion de fichiers en JavaScript
Une autre facette de la gestion des fichiers est la diffusion en continu de blocs de données, ce qui devient une nécessité lors du traitement de fichiers volumineux. Voici un exemple artificiel d'écriture en blocs de diffusion en continu :
const fs = require('fs');
const filename="large_file.txt";
const chunkSize = 1024 * 1024; // (1)
const content="This is some content to be written in chunks."; // (2)
const fileSizeLimit = 5 * 1024 * 1024; // // (3)
let writtenBytes = 0; // (4)
const writeStream = fs.createWriteStream(filename, { highWaterMark: chunkSize }); // (5)
function writeChunk() { // (6)
const chunk = content.repeat(Math.ceil(chunkSize / content.length)); // (7)
if (writtenBytes + chunk.length fileSizeLimit) {
console.error('File size limit reached');
writeStream.end();
return;
}
console.log(`Wrote chunk of size: ${chunk.length}, Total written: ${writtenBytes}`);
}
}
writeStream.on('error', (err) => { // (10)
console.error('Error writing file:', err);
});
writeStream.on('finish', () => { // (10)
console.log('Finished writing file');
});
writeChunk();
Le streaming vous donne plus de puissance, mais vous remarquerez qu'il implique plus de travail. Le travail que vous effectuez consiste à définir des tailles de blocs, puis à répondre aux événements en fonction des blocs. C'est l'essence même de l'évitement de mettre trop d'un fichier volumineux en mémoire à la fois. Au lieu de cela, vous le divisez en blocs et vous traitez chacun d'eux. Voici mes notes sur les parties intéressantes de l'exemple d'écriture ci-dessus :
- Nous spécifions une taille de bloc en kilo-octets. Dans ce cas, nous avons un bloc de 1 Mo, ce qui correspond à la quantité de contenu qui sera écrite à la fois.
- Voici du faux contenu à écrire.
- Maintenant, nous créons une limite de taille de fichier, dans ce cas, 5 Mo.
- Cette variable suit le nombre d'octets que nous avons écrits (nous pouvons donc arrêter d'écrire après 5 Mo).
- Nous créons le réel
writeStreamobjet. LehighWaterMarkL'élément lui indique la taille des morceaux qu'il acceptera. - Le
writeChunk()La fonction est récursive. Chaque fois qu'un fragment doit être traité, elle s'appelle elle-même. Elle le fait à moins que la limite du fichier ne soit atteinte, auquel cas elle se termine. - Ici, nous répétons simplement l'exemple de texte jusqu'à ce qu'il atteigne la taille de 1 Mo.
- Voici la partie intéressante. Si la taille du fichier n'est pas dépassée, nous appelons
writeStream.write(chunk):writeStream.write(chunk)retoursfalsesi la taille du tampon est dépassée. Cela signifie que nous ne pouvons pas mettre plus de données dans le tampon compte tenu de la limite de taille.- Lorsque la mémoire tampon est dépassée, le
drainl'événement se produit, géré par le premier gestionnaire, que nous définissons ici avecwriteStream.once('drain', writeChunk);. Notez qu'il s'agit d'un rappel récursif àwriteChunk.
- Cela permet de garder une trace de ce que nous avons écrit.
- Cela gère le cas où nous avons fini d'écrire et termine l'écriture du flux avec
writeStream.end();. - Ceci montre l’ajout de gestionnaires d’événements pour
erroretfinish.
Et pour le relire à partir du disque, nous pouvons utiliser une approche similaire :



GIPHY App Key not set. Please check settings