Comment écrire le fichier, si le dossier parent n'existe pas?
J'ai besoin d'écrire le fichier dans le chemin d'accès suivant:
fs.writeFile('/folder1/folder2/file.txt', 'content', function () {
});
Mais '/folder1/folder2'
chemin d'accès n'existe pas. Donc, je reçois le message d'erreur suivant:
message=ENOENT, open /folder1/folder2/file.txt
Comment puis-je écrire le contenu de ce chemin?
fs.promises.mkdir(path.dirname('/folder1/folder2/file.txt'), {recursive: true}).then(x => fs.promises.writeFile('/folder1/folder2/file.txt', 'content'))
Vous devez vous connecter pour publier un commentaire.
Utilisation mkdirp en combinaison avec
path.dirname
premier.Si le chemin d'accès complet existe déjà,
mkdirp
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 . Obtenu quand googler "writefile mkdirp". Ce module renvoie une promesse au lieu de prendre un callback, alors assurez-vous de lire quelques-uns introduction aux promesses du premier. Il peut compliquer les choses pour vous.
La fonction que j'ai donné fonctionne en tout cas.
fs.promises.mkdir(path.dirname(file), {recursive: true}).then(x => fs.promises.writeFile(file, data))
Je trouve que la meilleure façon de le faire est d'utiliser la outputFile() la méthode de la fs-extra module.
Exemple:
Il a aussi la promesse de soutien de la zone de ces jours!.
Peut-être plus simplement, vous pouvez simplement utiliser le fs-chemin mnp module.
Votre code devrait ressembler à:
Modifier
NodeJS version 10 a ajouté un support natif pour les deux
mkdir
etmkdirSync
pour créer le parent directrice de manière récursive avecrécursive: true
option est la suivante:Et si vous préférez
fs Promesses de l'API
, vous pouvez écrireRéponse Originale À Cette Question
Créer les répertoires parents de manière récursive si elles n'existent pas! (Zéro dépendances)
D'utilisation
Démo
Essayer!
Explications
EISDIR
pour Mac etEPERM
etEACCES
pour Windows.{isRelativeToScript: true}
.path.sep
etpath.resolve()
, pas seulement/
concaténation, pour éviter de croix-plate-forme de questions.fs.mkdirSync
et la gestion de l'erreur avectry/catch
si jetés à gérer des conditions de course: un autre processus peut ajouter le fichier entre les appels àfs.existsSync()
etfs.mkdirSync()
et provoque une exception.if (!fs.existsSync(curDir) fs.mkdirSync(curDir);
. Mais c'est un anti-modèle qui laisse le code vulnérable à des conditions de course.fs.promises
a été ajouté avec nœud 10 afin de ne pas être offensant, Offenso.Vous pouvez utiliser
stats
est unfs.Stats
type d'objet, vous pouvez vérifierstats.isDirectory()
. Selon l'examen deerr
etstats
vous pouvez faire quelque chose,fs.mkdir( ... )
ou de jeter une erreur.Référence
Mise à jour: correction de la virgule dans le code.
Voici ma fonction personnalisée pour créer des répertoires de manière récursive (sans dépendances externes):
Voici ma fonction qui travaille dans le Nœud 10.12.0. Espérons que cela aidera.
Voici une partie de Myrne Stol réponse éclaté comme une réponse distincte: