查看是否有任何文件与树中的blob匹配的最快方法

时间:2018-01-04 19:25:51

标签: node.js blob wildcard fs file-exists

我只想知道如果树中有任何带有给定扩展名的文件。我正在使用节点。

例如,我需要知道.jsx目录中是否有src/scripts个文件。如果我们可以使用blob / wildecards来做更好的事情,比如'** / * .jsx'。

我实际上可以使用一个可以返回所有匹配文件的blob,或者我可以使用一些递归...但是,一旦我只需要知道如果有任何文件匹配该模式,我认为可能会更好(更高效)的方式。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我使用的是包globhttps://www.npmjs.com/package/glob

var glob = require("glob")

// options is optional 
glob("**/*.js", options, function (er, files) {
  // files is an array of filenames. 
  // If the `nonull` option is set, and nothing 
  // was found, then files is ["**/*.js"] 
  // er is an error object or null. 
})

它可能不是最快的,但它已用于超过9,000个其他项目。

手动执行此操作的方法是从有效路径中读取所有文件夹和文件,并自行比较。

答案 1 :(得分:1)

好吧,我设法找到出路。 我确实在glob存储库中打开了一个问题: https://github.com/isaacs/node-glob/issues/356

但是,与此同时,我们可以使用他们的API与eventEmitter在第一场比赛中中止。

function thereIsAnyFileMatching (pattern, options = {}) {
  return new Promise((resolve, reject) => {
    let Glob = glob.Glob
    let g = new Glob(pattern, options)
    g.on('match', function(file){
      g.abort() // found
      resolve(true)
    })
    g.on('end', function(){
      resolve(false)
    })
    g.on('error', function(err){
      reject(err)
    })
  })
}

此处唯一的重要问题是,当中止时,共享“已中止”状态。因此,如果你连续多次调用它,并发性可能会给你误报,甚至最坏,永远不会解决(“结束”甚至永远不会被触发)。 所以......如果你不得不处理并发问题,那就不是一个直接的解决方案。

我转向并发的方式是使用“{...,...}”模式 因此,例如:{**/*.js,**/*.jsx}
在这种情况下,它只是一个正在执行的glob实例,正在寻找任何模式。但是又一次......有一个问题:p
它不会告诉你“匹配”事件中匹配的模式的哪一个。您只需自己验证(例如,通过检查文件扩展名)。

我希望有一天能帮到某人:)