web-dev-qa-db-fra.com

writeFile pas de tel fichier ou répertoire

J'ai un fichier (data.file une image), je voudrais enregistrer cette image. Maintenant, une image avec le même nom pourrait exister avant. Je voudrais écraser si oui ou le créer s'il n'existait pas depuis avant. J'ai lu que le drapeau "w" devrait le faire.

code:

            fs.writeFile('/avatar/myFile.png', data.file, {
                flag: "w"
            }, function (err) {
                if (err) {
                    return console.log(err);
                }
                console.log("The file was saved!");
            });

erreur:

{ [Error: ENOENT: no such file or directory, open '/avatar/myFile.png']
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path: '/avatar/myFile.png' }
25
Karl Morrison

C'est probablement parce que vous essayez d'écrire à la racine du système de fichiers au lieu de votre répertoire d'application '/avatar/myFile.png' -> __dirname + '/avatar/myFile.png' devrait faire l'affaire, vérifiez également si le dossier existe. node.js ne créera pas de dossier parent pour vous.

58
SergeS

Beaucoup d’entre nous ont cette erreur parce que parent path n’existe pas. Par exemple. Le répertoire /tmp est disponible, mais il n’existe pas de dossier "foo" et vous écrivez dans /tmp/foo/bar.txt.

Pour résoudre ce problème, vous pouvez utiliser:

var mkdirp = require('mkdirp');
var fs = require('fs');
var getDirName = require('path').dirname;

function writeFile(path, contents, cb) {
  mkdirp(getDirName(path), function (err) {
    if (err) return cb(err);

    fs.writeFile(path, contents, cb);
  });
}

Source & discussion complète: https://stackoverflow.com/a/16317628/1737158

Ou si vous avez un environnement où vous pouvez utiliser async/wait:

const mkdirp = require('mkdirp');
const fs = require('fs');

const writeFile = async (path, content) => {
  await mkdirp(path);
  fs.writeFileSync(path, content);
}
7
Lukas

J'ai résolu un problème similaire en essayant de créer un fichier avec un nom contenant des caractères non autorisés. Faites attention à cela aussi car cela donne le même message d'erreur.

3
Svetlin Totev

J'ai rencontré cette erreur lors de la création asynchrone de dossiers imbriqués juste avant de créer les fichiers. Les dossiers de destination ne sont pas toujours créés avant que les promesses d’écriture des fichiers ne soient lancées. J'ai résolu cela en utilisant mkdirSync au lieu de 'mkdir' afin de créer les dossiers de manière synchrone.

try {
    fs.mkdirSync(DestinationFolder, { recursive: true } );
} catch (e) {
    console.log('Cannot create folder ', e);
}
fs.writeFile(path.join(DestinationFolder, fileName), 'File Content Here', (err) => {
    if (err) throw err;
});
0
Ikansen

En fait, le message d'erreur pour les noms de fichiers qui ne sont pas autorisés dans le système Linux/Unix est accompagné de la même erreur, ce qui est extrêmement déroutant. Veuillez vérifier le nom du fichier s'il contient l'un des caractères réservés. Ce sont les /,>, <, |,:, & caractères réservés pour le système Linux/Unix. Pour une bonne lecture, suivez ceci link

0
Maruf