Nodejs 遍历目录树 组建内存tree

最近好久都没写博客了,主要是没干iOS了,现在在写后端,用的Nodejs,加上最早java的功底,以及对javascript的了解,目前没什么问题+

说说最近的项目中遇到的一个小需求。

把硬盘所有文件爬一遍并计算hash,不过话说回来。nodejs的Stream是真的好用。

为什么有这个需求,不讲了。实现原理也就是visitor Pattern.tree model

以下是代码。

[javascript] view plain copy
  1. const fs = require('fs')  
  2. const path = require('path')  
  3.   
  4. const uuid = require('uuid')  
  5.   
  6. class Node {  
  7.   constructor(name, type, parent){  
  8.     this.name = name  
  9.     this.parent = parent  
  10.     this.child = []  
  11.     this.type = type  
  12.     this.id = uuid.v4()  
  13.   }  
  14. }  
  15.  
[javascript] view plain copy
  1. //这就是一个 visitor  
  2. function visit(dir, dirContext, func, done) {  
  3.   fs.readdir(dir, (err, entries) => {  
  4.     if (err || entries.length === 0) return done()  
  5.     let count = entries.length  
  6.     entries.forEach(entry => {  
  7.       func(dir, dirContext, entry, (entryContext) => {  
  8.         if (entryContext) {  
  9.           visit(path.join(dir, entry), entryContext, func, () => {  
  10.             count--  
  11.             if (count === 0) done()  
  12.           })  
  13.         }  
  14.         else {  
  15.           count --  
  16.           if (count === 0) done()  
  17.         }  
  18.       })  
  19.     })  
  20.   })  
  21. }  
  22.   
  23. let count = 0  
  24. let map = new Map()  
  25. let u = false  
  26. const clean = (dir, dirContext, entry, callback) => {  
  27.   console.log(count++)  
  28.   let fpath = path.join(dir, entry)  
  29.   
  30.   fs.lstat(fpath, (err, stats) => {  
  31.     if(err) return callback()  
  32.     if(stats.isFile()){  
  33.       let node = new Node(entry, 'file')  
  34.       map.set(node.id, node)  
  35.       dirContext.child.push(node)  
  36.       callback()   
  37.     }else if(stats.isDirectory()){  
  38.       let node = new Node(entry, 'folder')  
  39.       map.set(node.id, node)  
  40.       dirContext.child.push(node)  
  41.       callback(node)  
  42.     }else{  
  43.       let node = new Node(entry, 'unknown')  
  44.       u = node.id  
  45.       map.set(node.id, node)  
  46.       dirContext.child.push(node)  
  47.       callback(node)  
  48.     }  
  49.   })  
  50. }  
  51.   
  52. let n = new Node('usr''folder')  
  53. map.set(n.id, n)  
  54.   
  55. visit('/usr', n, clean, ()=> {  
  56.   fs.writeFile('test.json', JSON.stringify(n, null' '))  
  57.   console.log('----------------------------',map.size)  
  58.   console.log(map.get(n.id))  
  59. })
具体实现就是这些了。里面没有包括hashworker的代码

你可能感兴趣的:(Nodejs 遍历目录树 组建内存tree)