J'ai besoin de chercher dans le dossier parent où un script de générateur yeoman node.js est en cours d'exécution pour voir si un fichier existe, mais je ne connais pas le nom du fichier - seulement l'extension.
Glob: https://www.npmjs.com/package/glob
Structure des dossiers :
Supposons que le dossier Projet
est l'endroit où se trouve l'invite de commande ... Je souhaite exécuter un générateur Yeoman qui examine d'abord le dossier Company
pour voir si un fichier spécifique existe. Cela peut être n'importe quel nom de fichier, se terminant par .sln
.
Il y a beaucoup de ressources pour débutants, mais je ne trouve pas d'exemples qui montrent:
Voici ce que j'ai essayé de faire, mais je suis certes beaucoup plus adepte de C # que de JS.
var gOptions = { cwd: "../" }; var globbed = glob("*.sln", gOptions, function(err, files){ this.log(chalk.yellow("err = " + err)); this.log(chalk.yellow("files = " + files)); });
et ceci ...
var globbed = glob("../*.sln", function(err, files){ this.log(chalk.yellow("err = " + err)); this.log(chalk.yellow("files = " + files)); });
Dans les deux exemples, globbed
est un objet, mais je ne sais pas quelles sont ses propriétés, et je ne suis pas en mesure d'accéder à l'interne
Essentiellement, j'ai besoin de savoir si le fichier existe pour pouvoir exécuter une instruction If / Then dessus.
3 Réponses :
Essayez ceci.
const path = require('path'); const glob = require('glob'); glob( '*.sln', { cwd: path.resolve(process.cwd(), '..') }, // you want to search in parent directory (err, files) => { if (err) { throw err; } if (files.length) { // File exists. All matched filenames are inside files array. } else { // File does not exist. files array is empty. } } );
glob
est une fonction asynchrone, les résultats sont donc fournis dans un rappel et ne sont pas renvoyés de manière synchrone.
Vous pouvez également tester vos expressions glob en utilisant globster.xyz
Donc, si je voulais charger les résultats de votre exemple dans une variable, quelle serait la meilleure façon de le faire?
Ils se trouvent dans la variable files
. C'est juste que cette variable est accessible à l'intérieur de la fonction de rappel. Si vous ne souhaitez pas utiliser la fonction de rappel, essayez d'utiliser glob.sync ()
comme Mark l'a suggéré dans une autre réponse.
Je n'ai pas utilisé golb. J'espère que cela vous aidera.
var fs=require('fs'); var pattern=RegExp('.md$');//Enter file extension here fs.readdir('..//',(err,files)=>{ //console.log(files); if(files.find((file)=>{return pattern.test(file)==true;})){ //console.log('file found'); your code } else{ //console.log('file not found'); your code } });
C'est pour un générateur de template yeoman, donc console.log () n'est pas une option. :(
J'ai mis console.log à des fins de test. Vous pouvez modifier cela. J'ai également modifié ma réponse pour cela
Utilisez glob.sync :
const files = glob.sync("../*.sln");
ou simplement
const files = glob.sync("*.sln", { cwd: "../" });
files
sera un tableau de fichiers * .sln
, le cas échéant, dans le Dossier Parent. De toute évidence, glob.sync
est synchrone.
glob.sync () ... Duh! Merci! :RÉ
la deuxième option (sans l'option cwd) ne fonctionne pas pour moi