javascript - 如何在 node.js 中流式读取目录?

标签 javascript node.js

假设我有一个包含 100K+ 甚至 500k+ 文件的目录。我想用 fs.readdir 读取目录,但它是异步的,不是流式的。有人告诉我异步在完成读取整个文件列表之前使用内存。

那么解决方案是什么?我想用流方法读取 readdir。可以吗?

最佳答案

在现代计算机中,遍历一个包含 50 万个文件的目录没什么。当您在 Node.js 中异步 fs.readdir 时,它所做的只是读取指定目录中的文件名列表。它不读取文件的内容。我刚刚在目录中测试了 700K 个文件。加载这个文件名列表只需要 21MB 的内存。

一旦你加载了这个文件名列表,你只需一个一个地遍历它们,或者通过设置一些并发限制来并行遍历它们,你就可以轻松地使用它们。示例:

var async = require('async'),
    fs = require('fs'),
    path = require('path'),
    parentDir = '/home/user';

async.waterfall([
    function (cb) {
        fs.readdir(parentDir, cb);
    },
    function (files, cb) {
        // `files` is just an array of file names, not full path.

        // Consume 10 files in parallel.
        async.eachLimit(files, 10, function (filename, done) {
            var filePath = path.join(parentDir, filename);

            // Do with this files whatever you want.
            // Then don't forget to call `done()`.
            done();
        }, cb);
    }
], function (err) {
    err && console.trace(err);

    console.log('Done');
});

关于javascript - 如何在 node.js 中流式读取目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25757293/

相关文章:

javascript - Web 在 Cheerio 中抓取 HTML 表格

node.js - 在 TypeScript 中使用 instanceof

node.js - 使用 HTTPS 的 Apache 反向代理到 node.js 应用程序无法正常工作

mongodb - 我应该在node-mongodb-native中使用哪个ObjectID

javascript - Commander.js 收集多个选项总是包括默认

javascript - 居中的粘性菜单?

javascript - 用于打印的 Bootstrap css 仅以黑白打印

javascript - 将 angularjs 转换为纯 js 或如何将单个服务器用于 angular JS 和 Flask

javascript - 在页面加载时将 css 应用于所有 DIV 元素

javascript - 从最后一个大写字母到结尾剪切字符串