我只想知道如果树中有任何带有给定扩展名的文件。我正在使用节点。
例如,我需要知道.jsx
目录中是否有src/scripts
个文件。如果我们可以使用blob / wildecards来做更好的事情,比如'** / * .jsx'。
我实际上可以使用一个可以返回所有匹配文件的blob,或者我可以使用一些递归...但是,一旦我只需要知道如果有任何文件匹配该模式,我认为可能会更好(更高效)的方式。
有什么建议吗?
答案 0 :(得分:1)
我使用的是包glob
:https://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
它不会告诉你“匹配”事件中匹配的模式的哪一个。您只需自己验证(例如,通过检查文件扩展名)。
我希望有一天能帮到某人:)