Node.js 使用 find 和 head 读取大文件目录

洛雷托帕里西

在 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.stdouthead.stdin,最终输出来自head.stdout

所以,代码应该是这样的:

find.stdout.pipe(head.stdin);

并附加上dataclose侦听器head

head.stdout.on('data', ...);

head.on('close', ...);

对于错误处理,您可以将侦听器附加到find.stderrhead.stderr,因为这两个命令中的任何一个/两个命令都可能发生错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Node.js使用fs.readFileSync读取大文件

来自分类Dev

如何使用node.js读取大文件并不断进行更改

来自分类Dev

什么时候应该使用struct node * head = NULL和struct node * head = NULL?

来自分类Dev

使用 node js 和 fs 列出目录、子目录及其文件

来自分类Dev

list(LinkedList).head 和 Node head 的区别?

来自分类Dev

读取多个目录中的文件,使用Node和Promises将文件名与数据匹配

来自分类Dev

读取多个目录中的文件,使用Node和Promises将文件名与数据匹配

来自分类Dev

使用require和node.js加载远程js文件

来自分类Dev

使用Node JS和React js的文件加载问题

来自分类Dev

使用require和node.js加载远程js文件

来自分类Dev

安装和使用Node JS

来自分类Dev

安装和使用Node JS

来自分类Dev

使用Node.js和SSH2从SFTP服务器读取文件

来自分类Dev

这是使用node.js和jade打开文件并读取每一行的方法吗?

来自分类Dev

Node.js使用AES加密大文件

来自分类Dev

如何使用Node.js从Dropbox下载大文件?

来自分类Dev

如何从目录中使用node.js读取多个csv文件?

来自分类Dev

使用node.js读取Excel文件

来自分类Dev

无法使用Node.js读取文件

来自分类Dev

使用Node.js读取文件

来自分类Dev

无法使用Node.js读取文件

来自分类Dev

使用node.js读取文件

来自分类Dev

使用node.js,流和promise下载文件

来自分类Dev

使用Node.js和AngularJS提供静态文件

来自分类Dev

如何使用Node.js和Express编写多个文件

来自分类Dev

如何使用node.js和http下载文件?

来自分类Dev

使用Node.js和AngularJS提供静态文件

来自分类Dev

使用Java NIO读取和写入大文件

来自分类Dev

使用node.js和angular.js列出的简单目录,请注意是否有新文件

Related 相关文章

热门标签

归档