web-dev-qa-db-fra.com

Ne fonctionne pas fs.readFile dans le noeud js

J'ai:

 fs.readFile('../services/Prescipcion.xml', "utf8", function (err, data) {
    console.log("err->", err);
    console.log("data", data);
 });

Et il enregistre:

err-> { 
  [Error: ENOENT: no such file or directory, open '../services/Prescipcion.xml']
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path: '../services/Prescipcion.xml' 
}

Je ne comprends pas pourquoi cela se produit.

12
oihi08

Ça a marché pour moi

  var fs = require("fs");

    const readFIle = path => {
      fs.readFile(__dirname + path, "utf8", (err, data) => {
        if (err) {
          console.log(err.stack);
          return;
        }
        console.log(data.toString());
      });
      console.log("Program Ended");
    };

usage:

readFIle ("/ input.txt");

7
Hitesh Sahu

Le message d'erreur indique no such file or directory, Donc à première vue, cela signifie très probablement que le chemin d'accès au fichier est incorrect.

Soit le nom de fichier est incorrect (faute de frappe?) Soit le répertoire n'est pas résolu correctement. Notez qu'un chemin relatif sera résolu par rapport à process.cwd():

process.cwd(): Renvoie le répertoire de travail actuel du processus.

Vous pouvez essayer d'utiliser console.log(process.cwd()) pour vous aider à déboguer le problème.

Si le fichier Prescipcion.xml Doit être récupéré localement d'où le script est exécuté, vous pouvez également utiliser la construction suivante:

fs.readFileSync(path.join(__dirname, '../services') + '/Prescipcion.xml', 'utf8');

__dirname: Nom du répertoire dans lequel réside le script en cours d'exécution.

30
xaviert

Un exemple complet qui a fonctionné pour moi, basé sur une autre réponse

var fs = require('fs');
var path = require('path');
var readStream = fs.createReadStream(path.join(__dirname, '../rooms') + '/rooms.txt', 'utf8');
let data = ''
readStream.on('data', function(chunk) {
    data += chunk;
}).on('end', function() {
    console.log(data);
});
3
iamnotsam

Lorsque vous transmettez des données d'une application Web à un serveur Express, la racine fs réside sous le répertoire de l'application Web et NON PAS le répertoire racine du serveur. Par conséquent, le premier paramètre writeFile doit pointer vers un répertoire en dehors du répertoire du serveur ou être lié à l'arborescence des fichiers du serveur.

2
Matthew

vous pouvez utiliser un chemin relatif ou absolu comme argument fs.readFile, mais le fait est que j'ai été perplexe avec ceci:

si vous avez let path = 'c:\a\b\c.d et que vous souhaitez l'utiliser comme argument pour fs.readFile(path, {'utf-8'}, (err, content) => {//...your stuffs}) vous devez vous assurer que \ est un caractère d'échappement dans js , donc fs lit votre chemin comme c:abc.d puis il utilisera ce chemin comme chemin relatif donc fs recherchera C:\Users\dir_to_your_project\c:abc.d qui n'est évidemment pas valide chemin et il en résulte une erreur Error: ENOENT: no such file or directory...

alors comment résoudre ce problème?

c'est très simple, vous devez simplement remplacer \ par \\ dans le chemin souhaité avant de l'utiliser comme argument dans fs.readFile():

new_path_for_fsReadFileArg = path.replace(/\\/g,"\\\\");
0
ashkan nasirzadeh