J'ai besoin d'écrire le fichier dans le chemin suivant:
fs.writeFile('/folder1/folder2/file.txt', 'content', function () {…});
Mais le '/folder1/folder2'
chemin n'existe peut-être pas. Donc j'obtiens l'erreur suivante:
message = ENOENT, ouvrez /folder1/folder2/file.txt
Comment puis-je écrire du contenu sur ce chemin?
fs.promises.mkdir(path.dirname('/folder1/folder2/file.txt'), {recursive: true}).then(x => fs.promises.writeFile('/folder1/folder2/file.txt', 'content'))
Réponses:
Utilisez mkdirp en combinaison avec
path.dirname
first.Si tout le chemin existe déjà,
mkdirp
c'est un noop. Sinon, il crée tous les répertoires manquants pour vous.Ce module fait ce que vous voulez: https://npmjs.org/package/writefile . Je l'ai obtenu en recherchant sur Google "writefile mkdirp". Ce module renvoie une promesse au lieu de prendre un rappel, alors assurez-vous de lire d'abord une introduction aux promesses. Cela pourrait en fait compliquer les choses pour vous.
La fonction que j'ai donnée fonctionne en tout cas.
la source
fs.promises.mkdir(path.dirname(file), {recursive: true}).then(x => fs.promises.writeFile(file, data))
Je trouve que le moyen le plus simple de le faire est d'utiliser la méthode outputFile () du module fs-extra .
Exemple:
Il a également promis un support prêt à l'emploi ces jours-ci!
la source
Peut-être plus simplement, vous pouvez simplement utiliser le module npm fs-path .
Votre code ressemblerait alors à:
la source
Éditer
La version NodeJS
10.12.0
a ajouté un support natif pour les deuxmkdir
etmkdirSync
pour créer le directeur parent de manière récursive avec l'recursive: true
option comme suit:Et si tu préfères
fs Promises API
, tu peux écrireRéponse originale
Créez les répertoires parents de manière récursive s'ils n'existent pas! ( Zéro dépendances )
Usage
Démo
Essayez-le!
Explications
EISDIR
pour Mac etEPERM
etEACCES
pour Windows.{isRelativeToScript: true}
.path.sep
etpath.resolve()
, pas seulement la/
concaténation, pour éviter les problèmes multiplateformes.fs.mkdirSync
et gestion de l'erreur avectry/catch
if levée pour gérer les conditions de concurrence: un autre processus peut ajouter le fichier entre les appels àfs.existsSync()
etfs.mkdirSync()
et provoquer une exception.if (!fs.existsSync(curDir) fs.mkdirSync(curDir);
. Mais c'est un anti-pattern qui laisse le code vulnérable aux conditions de course.la source
Vous pouvez utiliser
stats
est unfs.Stats
type d'objet, vous pouvez vérifierstats.isDirectory()
. En fonction de l'examen deerr
etstats
vous pouvez faire quelque chose,fs.mkdir( ... )
ou lancer une erreur.Référence
Mise à jour: correction des virgules dans le code.
la source
Voici ma fonction personnalisée pour créer de manière récursive des répertoires (sans dépendances externes):
la source
Voici ma fonction qui fonctionne dans Node 10.12.0. J'espère que cela aidera.
la source
Avec node-fs-extra, vous pouvez le faire facilement.
Installez-le
Utilisez ensuite la méthode outputFile au lieu de writeFileSync
la source
Voici une partie de la réponse de Myrne Stol présentée comme une réponse distincte:
la source
la source