236 votes

Créer un répertoire lors de l'écriture dans un fichier en Node.js

J'ai bricolé avec Node.js et j'ai trouvé un petit problème. J'ai un script qui réside dans un répertoire appelé data . Je veux que le script écrive des données dans un fichier situé dans un sous-répertoire de l'arborescence de l'ordinateur. data sous-répertoire. Cependant, j'obtiens l'erreur suivante :

{ [Error: ENOENT, open 'D:\data\tmp\test.txt'] errno: 34, code: 'ENOENT', path: 'D:\\data\\tmp\\test.txt' }

Le code est le suivant :

var fs = require('fs');
fs.writeFile("tmp/test.txt", "Hey there!", function(err) {
    if(err) {
        console.log(err);
    } else {
        console.log("The file was saved!");
    }
}); 

Quelqu'un peut-il m'aider à trouver comment faire en sorte que Node.js crée la structure du répertoire s'il ne sort pas pour écrire dans un fichier ?

259voto

David Weldon Points 14329

Node > 10.12.0

fs.mkdir accepte désormais un { recursive: true } comme suit :

// Creates /tmp/a/apple, regardless of whether `/tmp` and /tmp/a exist.
fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => {
  if (err) throw err;
});

ou avec une promesse :

fs.promises.mkdir('/tmp/a/apple', { recursive: true }).catch(console.error);

Node <= 10.11.0

Vous pouvez résoudre ce problème avec un paquet comme mkdirp o fs-extra . Si vous ne voulez pas installer un paquet, veuillez consulter la réponse de Tiago Peres França ci-dessous.

173voto

Si vous ne voulez pas utiliser de paquetage supplémentaire, vous pouvez appeler la fonction suivante avant de créer votre fichier :

var path = require('path'),
    fs = require('fs');

function ensureDirectoryExistence(filePath) {
  var dirname = path.dirname(filePath);
  if (fs.existsSync(dirname)) {
    return true;
  }
  ensureDirectoryExistence(dirname);
  fs.mkdirSync(dirname);
}

73voto

lifeisfoo Points 11

Avec nœud-fs-extra vous pouvez le faire facilement.

Installez-le

npm install --save fs-extra

Utilisez ensuite le outputFile méthode. Sa documentation dit :

Presque la même chose que writeFile (c'est à dire qu'il écrase), sauf que si le répertoire parent n'existe pas, il est créé.

Vous pouvez l'utiliser de quatre façons.

Async/await

const fse = require('fs-extra');

await fse.outputFile('tmp/test.txt', 'Hey there!');

Utilisation des promesses

Si vous utilisez promesses voici le code :

const fse = require('fs-extra');

fse.outputFile('tmp/test.txt', 'Hey there!')
   .then(() => {
       console.log('The file has been saved!');
   })
   .catch(err => {
       console.error(err)
   });

Style de rappel

const fse = require('fs-extra');

fse.outputFile('tmp/test.txt', 'Hey there!', err => {
  if(err) {
    console.log(err);
  } else {
    console.log('The file has been saved!');
  }
})

Version de la synchronisation

Si vous voulez une version de synchronisation, il suffit d'utiliser ce code :

const fse = require('fs-extra')

fse.outputFileSync('tmp/test.txt', 'Hey there!')

Pour une référence complète, consultez le outputFile documentation et tout méthodes supportées par node-fs-extra .

27voto

jrajav Points 2789

Alerte à la publicité éhontée !

Vous devrez vérifier chaque répertoire dans la structure du chemin que vous souhaitez et le créer manuellement s'il n'existe pas. Tous les outils pour le faire sont déjà présents dans le module fs de Node, mais vous pouvez faire tout cela simplement avec mon module mkpath : https://github.com/jrajav/mkpath

13voto

illvart Points 149

Même réponse que ci-dessus, mais avec async await et prêt à l'emploi !

const fs = require('fs/promises');
const path = require('path');

async function isExists(path) {
  try {
    await fs.access(path);
    return true;
  } catch {
    return false;
  }
};

async function writeFile(filePath, data) {
  try {
    const dirname = path.dirname(filePath);
    const exist = await isExists(dirname);
    if (!exist) {
      await fs.mkdir(dirname, {recursive: true});
    }

    await fs.writeFile(filePath, data, 'utf8');
  } catch (err) {
    throw new Error(err);
  }
}

Exemple :

(async () {
  const data = 'Hello, World!';
  await writeFile('dist/posts/hello-world.html', data);
})();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X