2
votes

Utilisez glob node.js pour savoir si un fichier existe dans le dossier parent en utilisant un caractère générique

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 :

  • C: \ Work \
  • C: \ Work \ Company \
  • C: \ Work \ Company \ Project \

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:

  1. Comment chercher dans le dossier parent avec succès; et
  2. Comment travailler avec la sortie (vrai / faux?) à utiliser dans une variable pour la logique plus tard dans la fonction.

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.


0 commentaires

3 Réponses :


1
votes

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


2 commentaires

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.



1
votes

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
        }
    });


2 commentaires

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



3
votes

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.


2 commentaires

glob.sync () ... Duh! Merci! :RÉ


la deuxième option (sans l'option cwd) ne fonctionne pas pour moi