Comment créer un répertoire s'il n'existe pas à l'aide de Node.js?
Est-ce la bonne façon de créer un répertoire s'il n'existe pas.
Il devrait avoir toutes les autorisations pour le script et lisibles par les autres.
var dir = __dirname + '/upload';
if (!path.existsSync(dir)) {
fs.mkdirSync(dir, 0744);
}
- Double Possible de Node.js créer un dossier ou de l'utilisation existante
Vous devez vous connecter pour publier un commentaire.
Sync
méthodes est généralement un non-non: ne voulez pas bloquer la boucle d'événementsPas, pour de multiples raisons.
La
path
module ne dispose pas d'unexists
/existsSync
méthode. C'est dans lefs
module. (Peut-être vous avez juste fait une faute de frappe dans votre question?)Les docs explicitement décourager l'utilisation de
exists
.Puisque nous parlons d'un répertoire plutôt que d'un fichier, ce conseil implique que vous devriez juste inconditionnellement appel
mkdir
et ignorerEEXIST
.En général, Vous devriez éviter l' *
Sync
méthodes. Ils sont de blocage, ce qui ne signifie absolument rien d'autre dans votre programme peut se produire pendant que vous allez sur le disque. C'est une opération très coûteuse, et le temps qu'il faut brise le cœur hypothèse de nœud de boucle d'évènements.L' *
Sync
méthodes sont généralement d'amende dans le seul but rapide de scripts (ceux qui font une chose et puis la sortie), mais ne devrait jamais être utilisé lorsque vous êtes en train de rédiger un serveur: votre serveur sera pas en mesure de répondre à toute personne pour toute la durée de l'I/O demandes. Si plusieurs demandes de clients nécessitent des opérations d'e/S, votre serveur sera très rapidement paralysé.La seule fois que j'avais envisager d'utiliser *
Sync
méthodes dans un serveur d'application est une opération qui se passe une fois (et une seule fois), au démarrage. Par exemple,require
utilisereadFileSync
pour le chargement des modules.Même alors, vous devez toujours être prudent, car beaucoup d'e/S synchrones peuvent être inutilement ralentir votre serveur de temps de démarrage.
Au lieu de cela, vous devriez utiliser les e/S asynchrones méthodes.
Donc, si nous mettons ensemble de ces conseils, nous obtenons quelque chose comme ceci:
Et nous pouvons l'utiliser comme ceci:
Bien sûr, cela ne tient pas compte des cas limites comme
0744 == 484
.0o
au lieu de simplement0
. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...J'ai trouvé et npm module qui fonctionne comme un charme pour cette.
C'est tout simplement une manière récursive mkdir cas de besoin, comme un "mkdir -p ".
https://www.npmjs.com/package/mkdirp
Juste au cas où toute personne intéressée dans une version en ligne. 🙂
La
mkdir
méthode a la capacité de de manière récursive créer tous les répertoires dans un chemin qui n'existent pas, et d'ignorer ceux qui ne.De la Nœud v10/11 docs:
REMARQUE: Vous aurez besoin d'importer de l'intégré dans
fs
premier module.Voici maintenant un peu plus robuste exemple qui tire parti des indigènes ES Modules (avec indicateur activé et .mjs extension), des poignées non-les chemins de la racine, et les comptes pour les chemins d'accès complets:
Vous pouvez l'utiliser comme
createDirectories('/components/widget/widget.js');
.Et bien sûr, vous auriez probablement souhaitez obtenir plus de fantaisie en utilisant des promesses avec async/await à l'effet de levier de création de fichier plus lisible synchrone à la recherche alors que les répertoires sont créés; mais, qui est au-delà de la question du champ d'application.
Vous pouvez simplement utiliser
mkdir
et de capture de l'erreur si le dossier existe.C'est async (donc de meilleures pratiques) et coffre-fort.
(Éventuellement ajouter un deuxième argument à la mode.)
D'autres pensées:
Vous pourriez utiliser, puis sur ou à attendre en utilisant natif promisify.
Vous pouvez faire votre propre promesse méthode, quelque chose comme (non testé):
Pour le vérifier, vous pouvez utiliser:
Ou vous pouvez utiliser une bibliothèque, les deux plus populaires étant
mkdir('/path').catch(err => { if (err.code != 'EEXIST') throw err;}).then(myFunc);
!==
au lieu de!=
La meilleure solution serait d'utiliser le mécanisme national de prévention module appelé nœud-fs-extra. Il a une méthode appelée
mkdir
qui crée le répertoire que vous avez mentionné. Si vous donnez un long chemin d'accès au répertoire, il va créer le parent dossiers automatiquement. Le module est un super jeu de mnp modulefs
, de sorte que vous pouvez utiliser toutes les fonctions defs
aussi, si vous ajoutez ce module.Avec le fs-extra paquet, vous pouvez faire cela avec un one-liner:
existsSync
est obsolète.fs.exists()
est obsolète, maisfs.existsSync()
ne l'est pas. Pourriez-vous ajouter un lien vers une ressource en disant quefs.existsSync()
est amorti?Apr 2018
: nodejs.org/api/fs.html#fs_fs_existssync_pathCela peut vous aider 🙂
Je voudrais ajouter un Tapuscrit Promesse refactoriser de josh3736 réponse.
Il fait la même chose et le même bord des cas, il arrive juste à utiliser des Promesses, tapuscrit typedefs et travaille avec "use strict".
Vous pouvez utiliser un nœud Système De Fichiers commande fs.stat pour vérifier si le répertoire existe et fs.mkdir pour créer un répertoire avec de rappel, ou fs.mkdirSync pour créer un répertoire sans rappel, comme dans cet exemple:
Voici une petite fonction pour recursivlely de créer des répertoires:
Solution
Avec Nœud 10 + ES6:
À l'aide async /await:
Vous aurez besoin de promisify
fs
: