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 ?

11voto

micx Points 111

Comme je ne peux pas encore commenter, je poste une réponse améliorée basée sur la solution fantastique de @tiago-peres-frança (merci !). Son code ne fait pas de répertoire dans un cas où seul le dernier répertoire est manquant dans le chemin, par exemple l'entrée est "C:/test/abc" et "C:/test" existe déjà. Voici un extrait qui fonctionne :

function mkdirp(filepath) {
    var dirname = path.dirname(filepath);

    if (!fs.existsSync(dirname)) {
        mkdirp(dirname);
    }

    fs.mkdirSync(filepath);
}

9voto

Mon conseil est le suivant : essayez de ne pas compter sur des dépendances lorsque vous pouvez facilement le faire avec quelques lignes de code

Voici ce que vous essayez d'obtenir en 14 lignes de code :

fs.isDir = function(dpath) {
    try {
        return fs.lstatSync(dpath).isDirectory();
    } catch(e) {
        return false;
    }
};
fs.mkdirp = function(dirname) {
    dirname = path.normalize(dirname).split(path.sep);
    dirname.forEach((sdir,index)=>{
        var pathInQuestion = dirname.slice(0,index+1).join(path.sep);
        if((!fs.isDir(pathInQuestion)) && pathInQuestion) fs.mkdirSync(pathInQuestion);
    });
};

2voto

Amida Points 517

Je viens de publier ce module parce que j'avais besoin de cette fonctionnalité.

https://www.npmjs.org/package/filendir

Il fonctionne comme une enveloppe autour des méthodes fs de Node.js. Vous pouvez donc l'utiliser exactement de la même manière que vous le feriez avec fs.writeFile y fs.writeFileSync (écritures asynchrones et synchrones)

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