在 node.js 中,我使用 spawnfind
而不是使用fs.readdir
更慢的方式读取文件:
scanDirStream: function (needle, params) {
var options = {
type: 'f',
name: '*'
};
for (var attrname in params) { options[attrname] = params[attrname]; }
return new Promise((resolve, reject) => {
var opt = [needle];
for (var k in options) {
var v = options[k];
if (!Util.empty(v)) {
opt.push('-' + k);
opt.push(v);
}
};
var res = '';
var find = spawn('find', opt)
find.stdout.on('data', _data => {
var buff = Buffer.from(_data, 'utf-8').toString();
if (buff != '') res += buff;
})
find.stderr.on('data', error => {
return reject(Buffer.from(error, 'utf-8').toString());
});
find.on('close', (_) => {
data = res.split('\n');
data = data.slice(0, data.length - 1);
return resolve(data);
});
});
}//scanDirStream
你这样称呼它
scanDirStream(path, { name: name }).then(files => console.log(files))
对于巨大的目录,我会进一步改进它限制find
, 在将列表返回到 Node.js 之前的输出,因此使用管道来head
喜欢:
find -type -f "*.mp3" | head -n 100
它应该像
var head = spawn('head',['-n','100])
var find = spawn('find', opt)
head.stdin.pipe(find)
find.stdout.on('data', _data => {
var buff = Buffer.from(_data, 'utf-8').toString();
if (buff != '') res += buff;
})
find.stderr.on('data', error => {
return reject(Buffer.from(error, 'utf-8').toString());
});
find.on('close', (_) => {
data = res.split('\n');
data = data.slice(0, data.length - 1);
return resolve(data);
});
但管道不能正常工作
管道应该从find.stdout
到head.stdin
,最终输出来自head.stdout
所以,代码应该是这样的:
find.stdout.pipe(head.stdin);
并附加上data
和close
侦听器head
head.stdout.on('data', ...);
head.on('close', ...);
对于错误处理,您可以将侦听器附加到find.stderr
和head.stderr
,因为这两个命令中的任何一个/两个命令都可能发生错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句