Windows节点中的快速文件夹散列

我正在构build一个nodewebkit应用程序,使本地目录与远程FTP保持同步。 要在第一次运行应用程序时构build初始索引,我从远程服务器下载包含所有文件及其文件夹的散列的索引文件。 然后我运行这个列表并在用户的本地文件夹中find匹配项。

远程/本地文件夹的总大小可以超过10GB。 正如你所想象的,扫描10GB的个人文件可能会非常缓慢,特别是在普通硬盘(不是SSD)上。

有没有办法在节点有效地得到一个文件夹的散列没有循环和散列每个单独的文件里面? 这样,如果文件夹散列不同,我可以select做昂贵的个人文件检查或不(我是如何做到这一点,我有一个本地索引与远程比较)。

您可以迭代地遍历目录,统计目录及其包含的每个文件,而不是跟随链接并生成散列。 这是一个例子:

'use strict'; // npm install siphash var siphash = require('siphash'); // npm install walk var walk = require('walk'); var key = siphash.string16_to_key('0123456789ABCDEF'); var walker = walk.walk('/tmp', {followLinks: false}); walker.on('directories', directoryHandler); walker.on('file', fileHandler); walker.on('errors', errorsHandler); // plural walker.on('end', endHandler); var directories = {}; var directoryHashes = []; function addRootDirectory(name, stats) { directories[name] = directories[name] || { fileStats: [] }; if(stats.file) directories[name].fileStats.push(stats.file); else if(stats.dir) directories[name].dirStats = stats.dir; } function directoryHandler(root, dirStatsArray, next) { addRootDirectory(root, {dir:dirStatsArray}); next(); } function fileHandler(root, fileStat, next) { addRootDirectory(root, {file:fileStat}); next(); } function errorsHandler(root, nodeStatsArray, next) { nodeStatsArray.forEach(function (n) { console.error('[ERROR] ' + n.name); console.error(n.error.message || (n.error.code + ': ' + n.error.path)); }); next(); } function endHandler() { Object.keys(directories).forEach(function (dir) { var hash = siphash.hash_hex(key, JSON.stringify(dir)); directoryHashes.push({ dir: dir, hash: hash }); }); console.log(directoryHashes); } 

你当然希望把它变成某种types的命令行应用程序来接受参数,并仔细检查文件是否每次都按正确的顺序返回(也许在散列之前根据文件名sorting文件统计信息) siphash每次都会返回正确的散列值。

这不是testing代码..只是为了提供一个例子,我可能从那种事情开始。

编辑:并减less依赖关系,如果你想要require('crypto'); ,你可以使用节点的encryption库而不是siphash require('crypto'); 如果你愿意的话,自己走路/统计目录和文件。