NodeJS 在目录中递归地哈希文件

2024-05-14

我能够实现目录中的递归文件遍历(即探索目录中的所有子目录和文件)。为此我使用了answer https://stackoverflow.com/questions/5827612/node-js-fs-readdir-recursive-directory-search/5827895#5827895来自堆栈溢出的相应帖子。其片段如下:

var fs = require("fs");

var tree = function(dir, done) {
  var results = {
        "path": dir,
        "children": []
      };
  fs.readdir(dir, function(err, list) {
    if (err) { return done(err); }
    var pending = list.length;
    if (!pending) { return done(null, results); }
    list.forEach(function(file) {
      fs.stat(dir + '/' + file, function(err, stat) {
        if (stat && stat.isDirectory()) {
          tree(dir + '/' + file, function(err, res) {
            results.children.push(res);
            if (!--pending){ done(null, results); }
          });
        } else {
          results.children.push({"path": dir + "/" + file});
          if (!--pending) { done(null, results); }
        }
      });
    });
  });
};

module.exports = tree;

当我跑步时:

 tree(someDirectoryPath, function(err, results) {
        if (err) throw err;

        console.log(results);
      });

我得到一个示例结果,例如:

{ path: '/Users/UserName/Desktop/1',
  children: 
   [ { path: '/Users/UserName/Desktop/1/file1' },
     { path: '/Users/UserName/Desktop/1/file2' },
     { path: '/Users/UserName/Desktop/1/file3' },
     { path: '/Users/UserName/Desktop/1/subdir1',
       children: [Object] } ] }

我还可以使用 fs 模块 ReadStream 方法对特定位置的单个文件进行哈希处理。其片段如下:

/**
 * Checking File Integrity
 */
var fs = require('fs'),
      args = process.argv.splice('2'),
      path = require('path'),
      traverse = require('/Users/UserName/Desktop/tree.js'),
      crypto = require('crypto');
//var algorithm = ['md5', 'sha1', 'sha256', 'sha512'];
var algorithm = 'sha512';
var hashTable = new Array();

        var hash = crypto.createHash(algorithm);

        var fileStream = fs.ReadStream(args[0]);

        fileStream.on('data', function(data) {
                hash.update(data);
        fileStream.on('end', function() {
                var digest = hash.digest('hex');
                console.log('algorithm used: ', algorithm);
                console.log('hash for the file: ',digest);
                hashTable[args[0]] = digest;
                console.log(hashTable);
        });
});

其中args[0]存储ReadStream要读取的文件的位置。对特定文件进行哈希处理后,返回的控制台日志如下:

node fileIntegrityChecker.js hello.txt
algorithm used:  sha512
hash for the file:  9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
the hashtable is: [ 'hello.txt': '9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043' ]

我的问题是我试图以某种方式将树模块功能集成到哈希相关的 js 文件中。我的想法是该程序将捕获用户的输入,作为目录的路径并且该输入将被处理以遍历文件夹的整个子目录和文件。另外,fileStream.on方法应包含在树模块的回调中。不过我对回调机制还没有完全了解,希望能从你那里得到一些见解。

这是我尝试过的

/**
 * Checking File Integrity
 */
var fs = require('fs'),
      args = process.argv.splice('2'),
      path = require('path'),
      tree = require('/Users/UserName/Desktop/tree.js'),
      crypto = require('crypto');
//var algorithm = ['md5', 'sha1', 'sha256', 'sha512'];
var algorithm = 'sha512';
var hashTable = new Array();

        var pathString = 'Users/UserName/Desktop/1';
        tree(pathString, function(err, results) {
            if (err) throw err;

            var hash = crypto.createHash(algorithm);
            var fileStream = fs.ReadStream(results.children[1]['path']);
             fileStream.on('data', function(data) {
                hash.update(data);
             fileStream.on('end', function() {
                var digest = hash.digest('hex');
                console.log('algorithm used: ', algorithm);
                console.log('hash for the file: ',digest);
                hashTable[results.children[1]['path']] = digest;
                console.log('The hashtable is: ', hashTable);
                });
            });
        });

现在,我已经取得了一些进展,没有收到错误。基本上我达到了我的范围。However我只能提取one结果明确。由于某种原因,我无法想象如何迭代(例如)获取结果 JSON 对象的每个子对象。如果这个问题解决了,我想问题就彻底解决了。

您能告诉我一种如何成功地将模块和js文件结合起来以递归遍历目录的所有内容并为其中的每个文件创建哈希的方法吗?我需要这个来根据文件的哈希值最终检查文件中是否发生了一些更改。谢谢你!


最简单的方法是在您已经遍历目录树时生成哈希值。这涉及更新 tree.js 文件,如下所示:

    } else {
      var fname = dir + "/" + file};
      // put your hash generation here
      generateHash(fname, function (e, hash) {
        if (e) done(e);

        results.children.push({"path": fname, "hash" : hash);
        if (!--pending) { 
          done(null, results); 
        }
      });
    }

然后将哈希生成代码放入如下函数中:

function generateHash (filename, callback) {
    var algorithm = 'sha512';
    var hashTable = new Array();

    var hash = crypto.createHash(algorithm);
    var fileStream = fs.ReadStream(filename);

    fileStream.on('data', function(data) {
        hash.update(data);      
    });
    fileStream.on('end', function() {
        var digest = hash.digest('hex');
        callback(null, digest);
    });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NodeJS 在目录中递归地哈希文件 的相关文章

  • ReactJS 服务器端渲染与客户端渲染

    我刚刚开始研究ReactJS 发现它提供了两种渲染页面的方式 服务器端和客户端 但是 我不明白如何一起使用它 构建应用程序是两种不同的方法 还是可以一起使用 如果我们可以一起使用它 该怎么做 我们需要在服务器端和客户端复制相同的元素吗 或者
  • 使用 React js 和 Express API 服务器通过 fetch 发布对象

    我在 fetch 中的 post 方法遇到麻烦 因为我的服务器从客户端接收到一个空对象 我已经检查了客户端 但无法发送我想要发送的值 这是我的服务器 const express require express const app expre
  • 寻找在 gulp 中复制文件并根据父目录重命名的方法

    对于每个模块 我都有一些需要复制到构建目录的文件 并且正在寻找一种方法来最大限度地减少重复代码 gulp src client src modules signup index js pipe gulp dest build public
  • 使用 Node.js 的前端 javascript 框架 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Nginx Node.js 快速下载大文件止于 1.08GB

    我有这个由 Nginx 代理的 Node js 应用程序 在生产环境中 路线是这样的 exports download function req res var id req params id if id id latest res do
  • 如何在Sequelize中配置一对多关系?

    我目前正在使用 Express 和 Sequelize MySQL 想知道解决这个问题的最佳方法是什么 如果这是一个基本问题 我很抱歉 因为我对 Sequelize 甚至 SQL 数据库都很陌生 我有一个模型User像这样 export d
  • Jade - 从不同目录加载模板

    我正在尝试处理 Peepcode 的 Node js Full Stack 视频 他们似乎使用的是旧版本的express jade 没有提到使用块 扩展来渲染布局 应用程序中使用的设置是有一个为所有子应用程序加载的 views layout
  • 从子文件夹运行的 Node.js 服务器

    所以我参加 Node js 聚会已经很晚了 主要是没人邀请我 Thanks 也就是说 我开始解决这个问题 我有 ASP 经典背景 所以有一些东西我还没有理解 如果有人能指出我正确的方向 那就太好了 提前致谢 因此 我正在以标准方式设置服务器
  • 如何通过 JS 中的 WebPack 包提供全局 TypeScript 类

    我目前正在研究 TypeScript 我想用 TS 替换 JS 但是我有很多 JS 文件 所以我只想在 TS 中创建新类 并想在我的旧 JS 文件 atm 中使用这些类 后来我想把所有的JS都换成TS 我对 webpack 和捆绑的 js
  • React Native 入门项目捆绑失败并出现意外令牌错误

    我正在尝试使用以下说明创建我的第一个适用于 Android 的 React Native 应用程序https facebook github io react native docs getting started html https f
  • 非法的break语句(Node.js)

    尝试在 Node js 和 MongoDB 中查找唯一 ID 方法是创建一个 while 循环来查询 MongoDB 中的现有 ID 直到找到唯一值 如果 ID 已被使用 则最后的数字会递增 直到 Mongo 不返回任何内容 一切正常 除了
  • 未知错误:SyntaxError:ng 命令上出现意外的标记“导出”

    我正在尝试学习 Angular我已按照此处的步骤操作 https angular io guide setup local https angular io guide setup local在 Ubuntu 18 04 5 LTS 上进行
  • Node.js ES6如何从模块导出类? [复制]

    这个问题在这里已经有答案了 我正在尝试从 Node js 6 2 0 中的 CommonJS 模块导出 ES6 类 class MyClass class contents here exports MyClass 然后将其导入到另一个模块
  • Node.js 中的 JSON Zip 响应

    我对 node js 还很陌生 我正在尝试发回包含 JSON 结果的 zip 文件 我一直在尝试弄清楚如何去做 但还没有达到预期的结果 我正在使用 NodeJS ExpressJS LocomotiveJS Mongoose 和 Mongo
  • npm 错误! asyncWrite 不是一个函数

    npm 安装 g firebase tools npm 错误 asyncWrite 不是一个函数 npm 错误 pna nextTick 不是函数 npm 错误 此运行的完整日志可以在以下位置找到 npm 错误 home developer
  • 猫鼬递归填充

    我已经搜索了一段时间 但没有找到任何好的答案 我有n deep我存储在数据库中并且想要填充的树所有的父母所以最后我得到了完整的树 node parent parent parent 到目前为止 我已达到 2 级 正如我提到的 我需要达到 2
  • 将 JSON var 从路由传递到 ejs

    我在express EJS中有一些代码 1 在 app js 中 创建 mongo 集合对象 app locals userCollection db get userData 2 在user js快速路由文件中 我从这个数据库连接获取数据
  • 运行 Angular 应用程序:错误:0308010C:数字信封例程::不支持[重复]

    这个问题在这里已经有答案了 当我尝试运行角度应用程序时发现此错误 有什么建议吗 Error error 0308010C digital envelope routines unsupported at new Hash node inte
  • 可以模拟多个并发连接来测试 Nodejs 应用程序

    我有一个简单的node js socket io websockets 应用程序运行 localhost 我想看看它可以处理多少并发连接 是否可以在本地主机本身上模拟多个并发用户 这是我使用 socket io client 的半生尝试 f
  • 用于将字符串与通配符模式进行匹配的递归函数

    所以我一整天都在试图解决这个作业 只是无法完成 以下函数接受 2 个字符串 第二个 不是第一个 可能包含 的 星号 An 是字符串的替换 空 1个字符或更多 它可以出现 仅在s2中 一次 两次 更多或根本不出现 它不能与另一个相邻 ab c

随机推荐

  • Angular *ngFor 循环遍历数组的数组

    我有一个数组 其中包含其他数组 如下所示 array element A element B YES NO 我想使用 ngFor 循环遍历 HTML 表中的这个对象数组 table thead tr th th th COLUMN 1 th
  • 如果条件长度 > 1 并且仅使用第一个元素,为什么我会在 R 中收到此警告

    我有下面的源代码 这if is na monthData 用于检查是否monthData is NA 如果是 则为其分配一个初始值 monthData lt NA if category QUARTER for m in c rep 1 4
  • 如果tinyMCE编辑器为空,如何通过在其旁边附加字符串来验证它?

    我需要验证一个表格 此表单有一些下拉菜单和tinyMCE编辑器 我通过在每个字段后附加字符串 Required 如果为空 来验证此表单 但是我无法验证tinyMCE编辑器 如果编辑器为空 我尝试了类似的操作 tinyMCE get tiny
  • 为什么不能在 Fragment 中使用 ViewPager?它实际上是

    有信息无法使用ViewPager在一个Fragment在许多来源中 例如 Android 开发者繁忙编码指南 http commonsware com 作者 Mark Murphy 或者类似的帖子this https stackoverfl
  • PHP MySQL 查询带有 %s 和 %d

    SELECT COUNT AS test FROM s WHERE id d AND tmp mail lt gt 什么是 s and d for 这些是使用的格式符号 例如经过sprintf 例子 Output SELECT COUNT
  • 无法在我的 Django 项目中使用 Sphinx 生成自动文档

    我正在向我的 Django 项目添加文档 github链接 https github com augustakingfoundation queryjane app 该项目是开源的 使用sphinx 但是当尝试生成python文件的auto
  • OAuth2 隐式流程 - IFrame 刷新身份

    我正在为隐式流开发 OAuth2 客户端 并正在实现基于 IFrame 的刷新 因为隐式流中没有刷新令牌 我所坚持的是试图找出将访问令牌传递回服务器的 标准 我是否通过 access token 查询字符串参数传回 或者在设置 IFrame
  • 音频流的最佳实践

    我正在编写一个应用程序来播放远程服务器的音频 我尝试了多种方法来实现流音频 但它们对我来说都不够好 这就是我尝试过的 幼稚地使用 MediaPlayer 就像是 MediaPlayer player new MediaPlayer play
  • 将数组数据从 html 表单传递到 php 数组变量

    我有一张表格来记录一组项目的工作时间 该表单使用项目 ID 小时数和注释字段的数组 表单行是项目数量的循环 该表单将数据传递给 PHP 脚本进行处理 PHP 脚本没有看到数组中的值 它只是给我 Array 作为输出 文档和其他示例让我想知道
  • 如何在 Xamarin.iOS 应用程序中创建导航?

    我习惯于与Xamarin Forms 我用 XAML 或 C 创建一个页面并导航到它 但现在这是我第一次尝试创建一个不适合的 iOS 应用程序Xamarin Forms 我在 Windows PC 上的 Visual Studio 中进行此
  • 是否可以将整个“卡片”包装在 标记中?

    在我的网站中 我有 卡片 每张卡片都包含许多元素 图像 文本 日期等 这有点像 Twitter 中的推文卡 我希望整个卡片都是可点击的 应该是到另一个页面的链接 目前 我有顶级元素作为 a 标记和使用aria label and aria
  • 删除 R 中具有重复属性的行

    我有一个大数据框 其中包含以下列 ID time OS IP 该数据帧的每一行对应一个条目 在该数据框中对于某些IDs存在多个条目 行 我想删除这些多行 显然 同一 ID 的其他属性会有所不同 或者换句话说 我只想要每个 ID 一个条目 行
  • 提升 asio 和 endian

    我不知道 boost asio 是否处理字节序 Asio 确实会转换类似的东西port进入网络秩序 转换函数不作为官方接口的一部分公开 而是隐藏在detail名称空间代替 例如boost asio detail socket ops hos
  • YouTube 数据 api 未按 viewCount 排序

    我正在尝试按 viewCount 从高到低排序 YouTube 频道视频 但结果并不是按最大观看次数排序 以下是我正在使用的 API https www googleapis com youtube v3 search key api ke
  • Response.Buffer / Flush 似乎不起作用

    我有一个经典的 asp 页面 用户使用 Response Buffer True 和 Flush 在我的本地电脑上 这个页面运行得非常好 我已将该页面上传到我的网络服务器 但它不起作用 我唯一能够检查的是两台机器上 IIS 下的 ASP B
  • 如何使用express在node.js中使浏览器关闭后会话过期?

    我在用 req session cookie maxAge 14 24 3600 1000 0 让会话在两周后过期 但现在我想让它在浏览器关闭后过期 有什么办法可以做到吗 来自连接会话中间件文档 https github com expre
  • Google Apps 脚本:连接日期和时间

    更新 要使用 AppsScript 创建 Google 日历事件 我们可以使用以下简单方法createEvent eventName startTime endTime 我已经使用过这个并且没有任何问题 但我使用的唯一日期格式是谷歌表格中的
  • 显式与隐式 SQL 连接

    显式内连接与隐式内连接之间有效率差异吗 例如 SELECT FROM table a INNER JOIN table b ON a id b id vs SELECT a b FROM table a table b WHERE a id
  • 如何在 iOS 中设置视图的最大宽度?

    我的应用程序有一个基本的登录屏幕 一个外框以及其中的一些文本字段和按钮 我将框设置为填满屏幕 然而 在某些设备上这个盒子会太大 如何设置视图的最大宽度和高度 您可以使用自动布局约束 使框适应屏幕尺寸 但不超过给定的宽度和高度 为此 请对宽度
  • NodeJS 在目录中递归地哈希文件

    我能够实现目录中的递归文件遍历 即探索目录中的所有子目录和文件 为此我使用了answer https stackoverflow com questions 5827612 node js fs readdir recursive dire