J'ai un fichier relativement petit (quelques centaines de kilo-octets) que je veux être en mémoire pour un accès direct pour toute l'exécution du code.
Je ne connais pas exactement les internes de NodeJs, donc je demande si un fs open
suffit ou je dois lire tous les fichiers et les copier dans un Buffer
?
Fondamentalement, vous devez utiliser la fonction readFile
ou readFileSync
du module fs
. Ils renvoient le contenu complet du fichier donné, mais diffèrent dans leur comportement (asynchrone contre synchrone).
Si le blocage de Node.js (par exemple au démarrage de votre application) n'est pas un problème, vous pouvez opter pour la version synchronisée, ce qui est aussi simple que:
var fs = require('fs');
var data = fs.readFileSync('/etc/passwd');
Si vous devez devenir asynchrone, le code est comme ça:
var fs = require('fs');
fs.readFile('/etc/passwd', function (err, data ) {
// ...
});
Veuillez noter que dans les deux cas, vous pouvez donner un objet options
comme deuxième paramètre, par ex. pour spécifier l'encodage à utiliser. Si vous omettez l'encodage, le tampon brut est retourné:
var fs = require('fs');
fs.readFile('/etc/passwd', { encoding: 'utf8' }, function (err, data ) {
// ...
});
Les encodages valides sont utf8
, ascii
, utf16le
, ucs2
, base64
et hex
. Il existe également un codage binary
, mais il est obsolète et ne devrait plus être utilisé. Vous pouvez trouver plus de détails sur la façon de gérer les encodages et les tampons dans la documentation appropriée .
Aussi facile que
var buffer = fs.readFileSync(filename);
Avec Node 0.12, il est possible de le faire de manière synchrone maintenant:
var fs = require('fs');
var path = require('path');
// Buffer mydata
var BUFFER = bufferFile('../public/mydata');
function bufferFile(relPath) {
return fs.readFileSync(path.join(__dirname, relPath)); // zzzz....
}
fs
est le système de fichiers. readFileSync () renvoie un tampon ou une chaîne si vous le demandez.
fs
suppose correctement que les chemins relatifs sont un problème de sécurité. path
est une solution de contournement.
Pour charger en tant que chaîne, spécifiez l'encodage:
return readFileSync(path,{ encoding: 'utf8' });